我有这个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">
有人知道我需要做什么才能看到所有这三个人吗?
感谢。
答案 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>
您明确选择从特定上下文开始的所有人物元素。在这种情况下,我认为,仅在这种情况下,您将仅迭代前两个元素。
因此,你的测试中有一些奇怪的东西。