如何在 XSLT 中的特定树层次结构中选择标签?
Posted
技术标签:
【中文标题】如何在 XSLT 中的特定树层次结构中选择标签?【英文标题】:How to select tag at specific tree hierarchy in XSLT? 【发布时间】:2021-10-11 09:43:18 【问题描述】:我正在使用 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/color 元素。
所以,我想问一下:
-
是否可以应用 */apple/color 之类的通配符在 XSL 1.0 中获得所需的行为?
如果是,请提出建议
更新:
抱歉,我之前忘了提到随机文本已正确定义,但我必须为许多此类 xml 文件执行此操作,所以我想要类似:<any-namespace:apple>/<any-namespace:colour>
元素
【问题讨论】:
XPath 适用于带有名称空间的 XML,因此对于带有前缀的示例,我们需要查看所用前缀的任何名称空间声明。 @MartinHonnen 我稍微更新了问题,请参阅 【参考方案1】:也许我在这里忽略了要点,因为这似乎是一个微不足道的问题。表达式:
/Fruits/random-text:apple/random-text:colour
将选择random-text:apple
分支中的random-text:colour
元素,并排除random-text:round-fruits
分支中的另一个random-text:colour
元素。
这是假设您的 XML 有一个正确的 random-text
前缀命名空间声明,并且此声明在您的样式表中重复。
演示:https://xsltfiddle.liberty-development.net/asoTKq
-- 已添加--
我必须为许多这样的 xml 文件这样做,所以我想要类似:any-namespace:apple/any-namespace:colour element
这不是一个健康的情况。命名空间是 XML 模式的一部分 - 应该为特定模式编写样式表。
不过,你可以这样做:
/Fruits/*[local-name()='apple']/*[local-name()='colour']
【讨论】:
对不起,我忘了在问题中提到,所以随机文本是正确定义的,但我必须为许多具有不同名称空间的 xml 文件这样做,所以我想要类似:/以上是关于如何在 XSLT 中的特定树层次结构中选择标签?的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 ICollectionView 过滤 wpf 树视图层次结构?