如何检查XML标记是否包含值并相应地执行操作

时间:2016-10-17 12:35:58

标签: xslt xslt-1.0 xslt-2.0

我有一个XML:

<?xml version="1.0" encoding="UTF-8"?>
<COLLECTION>
<Weight>15 kg</Weight>
<WeightUnits></WeightUnits>
</COLLECTION>

我想对KG执行KG

为此我写了:

<xsl:template match="Weight">
        <weight>
            <xsl:value-of
                select="translate(., translate(., '.0123456789', ''), '') div 0.45359237" />
        </weight>
    </xsl:template>
    <xsl:template match="WeightUnits">
        <weightUnits>lbs</weightUnits>
    </xsl:template>

一切正常:

我的问题是如何检查<Weight>

中是否存在数据

即如果Weight的值存在,那么只有weightUnits包含LBS,而Weight为空weightUnits也是空的。

请帮我解决这个问题。

2 个答案:

答案 0 :(得分:0)

尝试以下方法:

XSLT 1.0:

emplace_back

XSLT 2.0:

<xsl:template match="WeightUnits">
   <weightUnits>
      <xsl:if test="../Weight!=''">
        <xsl:value-of select="'lbs'"/>
      </xsl:if>
   </weightUnits>
</xsl:template>

答案 1 :(得分:0)

这是一个完全不使用任何XSLT条件运算符的解决方案

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes"/>

  <xsl:template match="node()|@*">
    <xsl:copy>
      <xsl:apply-templates select="node()|@*"/>
    </xsl:copy>
  </xsl:template>  

  <xsl:template match="Weight">
    <weight><xsl:apply-templates/></weight>
   </xsl:template>

   <xsl:template match="Weight/text()[normalize-space()]">
        <xsl:value-of
          select="translate(., translate(., '.0123456789', ''), '') div 0.45359237" />
   </xsl:template>

   <xsl:template match="WeightUnits">
     <weightUnits><xsl:apply-templates 
            select="../Weight[normalize-space()]" mode="lbs"/></weightUnits>
   </xsl:template>

   <xsl:template match="*" mode="lbs">lbs</xsl:template>
</xsl:stylesheet>

在提供的XML文档上应用此转换时

<COLLECTION>
    <Weight>15 kg</Weight>
    <WeightUnits></WeightUnits>
</COLLECTION>

产生了想要的正确结果

<COLLECTION>
    <weight>33.06933932773163</weight>
    <weightUnits>lbs</weightUnits>
</COLLECTION>

对以下XML文档应用相同的转换时<weight>为空):

<COLLECTION>
    <Weight></Weight>
    <WeightUnits></WeightUnits>
</COLLECTION>

再次生成想要的正确结果

<COLLECTION>
    <weight/>
    <weightUnits/>
</COLLECTION>