【发布时间】:2013-10-14 14:55:24
【问题描述】:
为了澄清标题,我有一个如下所示的 XML 文档:
<group>
<starter>Start</starter>
<backup1>Backup1</backup1>
</group>
<group>
<starter>Another starter</starter>
<backup1>Backup1</backup1>
<backup2>Backup2</backup2>
<backup3>Backup3</backup3>
<reserve>Reserve</reserve>
</group>
所以每个组可以有任意数量的<backupN> 标签。我需要确保我的 XSLT 抓取了所有这些并将它们重命名为“backup_n”。通常,我的 XSLT 会应用符合以下内容的内容:
<xsl:for-each select="group/backup">
并围绕该 xpath 选择进行循环。这显然行不通,因为即使只有 1 个备份,它仍然被命名为 <backup1> 并且还可以有任意数量的 <backupN> 标签。
像这样循环任意标签的最佳方法是什么?我正在使用 XSLT 1.0,所以不能真正使用任何 XSLT 2.0 的优点。
【问题讨论】:
-
您有一个包含错误命名元素的文档(
<backup1>到<backupN>)并且想要将其转换为另一个包含错误命名元素的文档(<backup_1>到<backup_N>)?如果您有能力,请将其更改为<backup num="1">...<backup num="N">,正是出于让您提出这个问题的原因。相同的元素应该具有相同的名称,因为如果不这样做,事情就会变得糟糕。 -
我很乐意 - 不幸的是,我无法控制 XML 的来源。我正在将其转换为 JSON,我只需要一种获取索引的方法,这样我就可以使 JSON 更合理。
-
啊,我明白了。我什至不想让您更改源代码,我只是想让您不要创建同样损坏的目标 XML。但既然你转换成 JSON,没关系。 :) 您可以使用
position()来获取索引,您不必使用substring-after()查看名称“后缀”。当然可以,但会更麻烦。 -
如果我将其转换为 JSON,我会使用数组进行备份,例如
{"starter":"Another starter", "backups":["Backup1", "Backup2", "Backup3"], "reserves":["Reserve"]}