带有任意标记的XML文档的XSLT

时间:2013-10-14 14:55:24

标签: xml xslt xpath

为了澄清标题,我有一个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选择。这显然不会起作用,即使只有一个备份,它仍然被命名为<backup1>,并且还可以有任意数量的<backupN>标记。

围绕这样的任意标签循环的最佳方法是什么?我使用的是XSLT 1.0,因此无法真正使用任何XSLT 2.0的优点。

1 个答案:

答案 0 :(得分:3)

如果您想要名称以backup开头的所有元素,您可以使用

<xsl:for-each select="group/*[starts-with(local-name(), 'backup')]">

但是,根据您尝试生成的输出类型,在模板匹配方面可能更清晰,而不是for-each

如果您特别想要限制名称为“backup”后跟数字的元素(例如backuptype之类的内容),那么您可以添加到谓词

group/*[starts-with(local-name(), 'backup')
    and number(substring(local-name(), 7)) = number(substring(local-name(), 7))]

(这看起来很奇怪,但诀窍是,如果substring(local-name(), 7)不是有效数字,则测试变为NaN = NaN,这总是假的 - NaN不等于任何东西,甚至不是)。