我有以下XML节点:
<parent>
<child1name>value</child1name>
<child2name>value</child2name>
<child3name>value</child3name>
<child4name>value</child4name>
<others />
</parent>
我想用格式化为文本[数字]文本的名称循环遍历每个节点。所以我做了:
<xsl:for-each select="parent/child*name">
Value <xsl:value-of select="position()" />: <xsl:value-of select="." />
</xsl:for-each>
但它没有起作用。
正确的模式是什么?可能是"childd{1}name"
?
正确的模式应该是
<xsl:for-each select="parent/*[starts-with(./name(),'child')]">
否则,如果你需要更严格的限制:
<xsl:for-each select="parent/*[starts-with(./name(),'child') and ends-with(./name(),'name')]">
此外,在这样的样式表中包含文本并不是一种好的做法。相反,您可以将任何文本包含在xsl:text
元素中。
使用您所显示的输入片段的整个样式表:
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text"/>
<xsl:template match="/">
<xsl:for-each select="parent/*[starts-with(./name(),'child') and ends-with(./name(),'name')]">
<xsl:text>Value </xsl:text>
<xsl:value-of select="position()" />
<xsl:text>: </xsl:text>
<xsl:value-of select="." />
<xsl:text> </xsl:text>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
这会产生以下输出:
Value 1: value
Value 2: value
Value 3: value
Value 4: value
我会更改XML结构。对我来说,在没有模式的情况下运行子元素更容易,比如:
<parent>
<childs>
<child>
<id>1</id>
<name>value</name>
</child>
<child>
<id>2</id>
<name>value</name>
</child>
<child>
<id>3</id>
<name>value</name>
</child>
<child>
<id>4</id>
<name>value</name>
</child>
</childs>
<others />
</parent>
我认为结构更清晰,只是一种不同的方法。
关于