for-each in xslt

时间:2012-11-22 15:41:08

标签: xml xslt

我需要循环我的根标签内的所有元素,如

<?xml version="1.0" encoding="UTF-8"?>    
<root>
<mijnFamilyPack>
    <rt>id123</rt>
    <rt>id345</rt>
    <rt>id084</rt>
    <INPORTING>NO</INPORTING>
    <id>345</id>
</mijnFamilyPack>
</root>

我写了for-each来获取所有“rt”元素值。但我可以单独使用第一个cvalue。

<xsl:for-each select="/root/mijnFamilyPack/">
<xsl:value-of select="rt"/>
</xsl:for-each>

请你告诉我如何单独获得“rt”值?

3 个答案:

答案 0 :(得分:3)

您只有一个节点mijnFamilyPack的实例,因此<xsl:for-each select="/root/mijnFamilyPack/">正在循环一次,并且您正在打印第一个rt节点的值。

您可能还希望将rt节点放在for-each中并打印当前节点的值,如下所示:

 <xsl:for-each select="/root/mijnFamilyPack/rt">
       <xsl:value-of select="."/>
 </xsl:for-each>

如果您认为mijnFamilyPack可能有多个节点,则使用嵌套循环,首先迭代mijnFamilyPack,然后再迭代rt mijnFamilyPack个节点内的 <xsl:for-each select="/root/mijnFamilyPack/"> <xsl:for-each select="rt"> <xsl:value-of select="."/> </xsl:for-each> </xsl:for-each>

{{1}}

答案 1 :(得分:2)

您正在选择mijnFamilyPack节点,而不是rt节点集:

<xsl:for-each select="/root/mijnFamilyPack/rt">
   <xsl:value-of select="."/>
</xsl:for-each>

考虑使用实际模板而不是for-each,但是:

<xsl:template match="/root/mijnFamilyPack/rt">
   <xsl:value-of select="."/>
</xsl:template>

答案 2 :(得分:1)

就像Oded所说,你应该使用模板来匹配rt元素。此处不应使用For-each(另请参阅此主题中的答案:For loops vs. apply-templates

如果将此XSLT应用于源XML:

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

<xsl:template match="/">
    <list>
        <xsl:apply-templates select="//rt"/>
    </list>
</xsl:template>

<xsl:template match="rt">
    <rt>
        <xsl:value-of select="."/>
    </rt>
</xsl:template>

</xsl:stylesheet>

你得到了所需的输出:

<?xml version="1.0" encoding="UTF-8"?>
<list>
<rt>id123</rt>
<rt>id345</rt>
<rt>id084</rt>
</list>

此致 彼得