如何在 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 元素。
那么,我想问一下:
- 是否可以应用像 */apple/colour 这样的通配符来在 XSL 1.0 中获得所需的行为?
- 如果是,请建议
更新:
抱歉,我之前忘了提到随机文本已正确定义,但我必须为许多这样的 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']
我正在使用 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 元素。
那么,我想问一下:
- 是否可以应用像 */apple/colour 这样的通配符来在 XSL 1.0 中获得所需的行为?
- 如果是,请建议
更新:
抱歉,我之前忘了提到随机文本已正确定义,但我必须为许多这样的 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']