使用<xsl:for-each>表示增量元素名称</xsl:for-each>

时间:2013-03-26 00:28:56

标签: xslt xpath foreach xslt-1.0

我有一个从java地图转换而来的XML。因此,所有映射键都转换为节点名称。 XML结构如下

<map>
    <firstName>AAA</firstName>
    <firstName1>BBB</firstName1>
    <firstName2>CCC</firstName2>
    <firstName3>DDD</firstName3>
</map>

我正在尝试编写for-each循环以从此XML中提取数据以创建输出XML。我已经尝试了大多数可用的选项,如name(),local-name(),contains()等,但是无法提供有用的东西。有哪些选项可用,因为增量节点名称可以达到100或更多。编码循环的任何输入都会有很大帮助。我正在使用XSLT 1.0。

2 个答案:

答案 0 :(得分:2)

有多种方法可以选择顶级元素(map)的子元素:

/*/*

这将选择所有XML文档顶部元素的子元素。

/*/*[starts-with(name(), 'firstName')]

这将选择所有top元素的children元素,其名称以字符串'firstName'开头。

/*/*[starts-with(name(), 'firstName') 
   and floor(substring-after(name(), 'firstName')) = substring-after(name(), 'firstName')) ]

这将选择所有top元素的children元素,其名称以字符串'firstName'开头,之后的剩余子字符串为整数。

/*/*[starts-with(name(), 'firstName') 
   and translate(name(), '0123456789', '') = 'firstName')) ]

这将选择所有top元素的children元素,其名称以字符串'firstName'开头,之后的剩余子字符串仅包含数字。

最后,在XPath 2.0(XSLT 2.0)中,可以使用正则表达式

/*/*[matches(name(), '^firstName\d+$')]

答案 1 :(得分:1)

这将选择所有第一级元素及其信息,然后您可以根据需要使用它们:

<xsl:for-each select="/*/*">
    <xsl:value-of select="local-name()"/>
    <xsl:value-of select="."/>
</xsl:for-each>