1

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

4

2 回答 2

2

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

/*/*

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

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

这将选择所有顶部元素的子元素,其名称以字符串开头'firstName'

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

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

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

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

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

/*/*[matches(name(), '^firstName\d+$')]
于 2013-03-26T01:51:47.130 回答
1

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

<xsl:for-each select="/*/*">
    <xsl:value-of select="local-name()"/>
    <xsl:value-of select="."/>
</xsl:for-each>
于 2013-03-26T03:23:32.340 回答