xml - 用于具有任意标签的 XML 文档的 XSLT

标签 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 选择。这显然是行不通的,因为即使只有 1 个备份,它仍然被命名为 <backup1>并且也可以有任意数量的 <backupN>标签。

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

最佳答案

如果您想要名称以 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始终为 false - NaN 不等于任何内容,甚至不等于其本身)。

关于xml - 用于具有任意标签的 XML 文档的 XSLT,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19363134/

相关文章:

c# - 如何根据 XAML 中定义的 XMLDataProvider 数据计算平均值

java - 双重转义 XML 实体

java - 没有获得Spring Security自动生成的登录页面

android - 无法使用 ADT eclipse 在图形布局中打开 Android 布局 xml 文件

xml - 在 XSLT v1.0 中使用结尾

使用 xsl 使用 svg 绘制 XML 点

Java xml 保存程序优化

xml - XSL 值返回不匹配

没有命名空间的 Python XpathEvaluator

Selenium:在没有输入标签的字段中输入文本 - 如何找到它是哪一个?