Xsl xml循环问题

时间:2011-06-28 07:10:32

标签: xml xslt xpath

我有这个xml,其中3个节点具有相同的名称<person>。问题是其中2个在一个父节点<people>下,而另一个在另一个<people>节点下,所以当Xsl循环时它只获得前2个。

XML:

<data>
  <people>
    <person></person>
    <person></person>
  </people>
  <people>
    <person></person>
  </people>
</data>

Xsl循环:

<xsl:for-each select="//person">

有人知道我需要做什么才能看到所有这三个人吗?

感谢。

3 个答案:

答案 0 :(得分:3)

使用可以将此模板与xsl:for-each

一起使用
<xsl:template match="data">
    <root>
        <xsl:for-each select="//person">
            <item>
                <xsl:value-of select="name(.)"/>
            </item>
        </xsl:for-each>
    </root>
</xsl:template>

答案 1 :(得分:1)

而不是xsl-foreach更好的方法是使用与人员节点匹配的模板:

<xsl:template match="/">
  <!-- match any person element that is a descendant of the root -->
  <xsl:apply-templates select="//person"/>
</xsl:template>

<xsl:template match="person">
   <!-- transform the person element here -->
</xsl:template match="person">

答案 2 :(得分:1)

XPath:

//person

选择所有人物元素,无论他们在XML输入中的位置(参见here)。

XSLT指令:

<xsl:for-each select="//person">

将迭代该XPath选择的所有人员元素。无论您使用此指令的上下文,转换都应该迭代所有三个元素。在类似的情况下(考虑到您的问题中提供的示例输入),情况并非如此:

<xsl:template match="/data/people[1]">
    <xsl:for-each select=".//person">
        <xsl:value-of select="name(.)"/>
    </xsl:for-each>
</xsl:template>

您明确选择从特定上下文开始的所有人物元素。在这种情况下,我认为,仅在这种情况下,您将仅迭代前两个元素。

因此,你的测试中有一些奇怪的东西。