0

如何for-each在 xslt 1.0 中编写一个循环,它只考虑SubbranchID=11 和 12 的元素,忽略 13 和 14。

<root>
  <branch ID='1'>
    <subbranch ID='11'>
      <Values DataType='String'>
        <Value StringLength='3'>abc</Value>
      </Values>
    </subbranch>
    <subbranch ID='12'>
      <Values DataType='String'>
        <Value StringLength='3'>def</Value>
      </Values>
    </subbranch>
    <subbranch ID='13'>
      <Values DataType='String'>
        <Value StringLength='3'>uvw</Value>
      </Values>
    </subbranch>
    <subbranch ID='14'>
      <Values DataType='String'>
        <Value StringLength='3'>xyz</Value>
      </Values>
    </subbranch>
  </branch>
</root>
4

2 回答 2

1

您可以将xsl:for-each与仅匹配前两个子分支的 XPath 表达式一起使用:

<xsl:template match="root">
    <xsl:for-each select="branch/subbranch[@ID='11' or @ID='12']">
        <!-- Emit something... -->
    </xsl:for-each>
</xsl:template>

或者,交替:

<xsl:template match="root">
    <xsl:for-each select="branch/subbranch[position() &lt; 3]">
        <!-- Emit something... -->
    </xsl:for-each>
</xsl:template>
于 2013-02-26T06:24:07.833 回答
0

建议避免for-each构造,除非处理<xsl:key>. 您应该使用match-templateandapply-templates构造,而不要考虑不需要的值。

此 XSLT 应用于您的源:

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

<xsl:output indent="yes" method="xml"/>

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

<xsl:template match="subbranch[@ID='13']"/>
<xsl:template match="subbranch[@ID='14']"/>

</xsl:stylesheet>

给出这个输出:

<?xml version="1.0" encoding="UTF-8"?>
<root>
<branch ID="1">
    <subbranch ID="11">
        <Values DataType="String">
            <Value StringLength="3">abc</Value>
        </Values>
    </subbranch>
    <subbranch ID="12">
        <Values DataType="String">
            <Value StringLength="3">def</Value>
        </Values>
    </subbranch>
</branch>
</root>

通过匹配空模板中不需要的值,您可以避免处理 XML 的那些部分,例如<xsl:template match="subbranch[@ID='13']"/>

于 2013-02-26T07:35:24.600 回答