循环节点模式的XSL



我有以下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>&#10;</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>

我认为结构更清晰,只是一种不同的方法。

关于

最新更新