如何在 XSLT 中的特定树层次结构中添加 select 标记?

How to select tag at specific tree hierarchy in XSLT?

我正在使用 XSLT。对于我的一项要求,我需要捕获标签 <random-text:apple>/<random-text:colour>

问题是我的 XSLT 版本是 1.0,所以我没有完整的正则表达式支持。

让我举一个简单的例子来说明问题的陈述:

sample.xml:

<Fruits>
  <random-text:apple>
    <random-text:colour>RED</random-text:colour>
    <random-text:shape>ROUND</random-text:shape>
  </random-text:apple>
  <random-text:round-fruits>
    <random-text:apple>
      <random-text:colour>RED</random-text:colour>
    </random-text:apple>
  </random-text:round-fruits>
</Fruits>

所以在 sample.xml 中,我想捕获 <random-text:apple>/<random-text:colour> 标签,但我想避免在其他树层次结构中使用相同的标签,例如 <random-text:round-fruits>/<random-text:apple>/<random-text:colour>

我试过这样的事情:"/*[contains(name(), 'apple')]/*[contains(name(), 'colour')]" 但正如您所怀疑的那样,它在所有树层次结构级别中都捕获了 /apple/colour 元素。

那么,我想问一下:

  1. 是否可以应用像 */apple/colour 这样的通配符来在 XSL 1.0 中获得所需的行为?
  2. 如果是,请建议

更新: 抱歉,我之前忘了提到随机文本已正确定义,但我必须为许多这样的 xml 文件做这件事,所以我想要这样的东西:<any-namespace:apple>/<any-namespace:colour> element

也许我在这里忽略了重点,因为这似乎是一个微不足道的问题。表达式:

/Fruits/random-text:apple/random-text:colour

将 select random-text:apple 分支中的 random-text:colour 元素,并排除 random-text:round-fruits 分支中的另一个 random-text:colour 元素。

这是假设您的 XML 对 random-text 前缀有一个正确的命名空间声明,并且该声明在您的样式表中重复。

演示:https://xsltfiddle.liberty-development.net/asoTKq


--添加--

I have to do it for many such xml files, so I want something like: any-namespace:apple/any-namespace:colour element

这不是一个健康的情况。命名空间是 XML 模式的一部分 - 应该为特定模式编写样式表。

不过,你可以这样做:

/Fruits/*[local-name()='apple']/*[local-name()='colour']