我有一个从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。
答案 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>