如何在xslt 1.0中编写for-each
循环,只考虑ID = 11和12的Subbranch
元素,忽略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>
答案 0 :(得分: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() < 3]">
<!-- Emit something... -->
</xsl:for-each>
</xsl:template>
答案 1 :(得分:0)
除了处理for-each
之外,建议避免<xsl:key>
构造。
您应该使用match-template
和apply-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']"/>
祝你好运, 彼得