XSLT:如何检查子节点是否具有特定的名称元素和空值元素?

时间:2015-04-15 16:44:53

标签: xml xslt if-statement

我需要检查order元素是否有一个节点“attribute”,它有一个子节点“name”,文本为SERIAL,子节点“value”为空。

示例输入#1:无序列号值。

 <orders>
       <order>
          <attributes>
             <attribute>
                <name>SERIAL</name>
                <value></value>
             </attribute>
             <attribute>
                <name>BATCH</name>
                <value>Batch1</value>
             </attribute>
          </attributes>
       </order>
    </orders>

#1的输出:无序列号

<externalorder>
   <batchnumbers>
     <batch>Batch1</batch>
   <batchnumbers>
</externalorder>

样品输入#2:带序列号但没有批号

  <orders>
       <order>
          <attributes>
             <attribute>
                <name>SERIAL</name>
                <value>1</value>
             </attribute>
             <attribute>
                <name>SERIAL</name>
                <value>2</value>
             </attribute>
             <attribute>
                <name>BATCH</name>
                <value></value>
             </attribute>
          </attributes>
       </order>
    </orders>

#2的输出

<externalorder>
   <serialnumbers>
     <serialnumber>1</serialnumber>
     <serialnumber>2</serialnumber>
   <serialnumbers>
</externalorder>

1 个答案:

答案 0 :(得分:1)

这仍然是同一个基本问题:您需要两个模板,一个匹配attribute[name='BATCH' and value!=''],另一个匹配attribute[name='SERIAL' and value!='']。如果你真的需要这样做,我会留给你弄清楚如何压制空节点。

更新了新的输入/输出:

<?xml version="1.0" encoding="utf-8" ?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="xml" indent="yes"/>

  <xsl:template match="/orders/order">
    <externalorder>
        <serialnumbers>
            <xsl:apply-templates select="attributes/attribute[name='SERIAL' and value!='']" />
        </serialnumbers>
        <batchnumbers>
            <xsl:apply-templates select="attributes/attribute[name='BATCH' and value!='']" />
        </batchnumbers>

    </externalorder>
  </xsl:template>

  <xsl:template match="attribute[name='SERIAL']">
    <serialnumber>
        <xsl:value-of select="value" />
    </serialnumber>
  </xsl:template>


  <xsl:template match="attribute[name='BATCH']">
    <batch>
        <xsl:value-of select="value" />
    </batch>
  </xsl:template>

</xsl:stylesheet>