如何在 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 中,我想捕获 &lt;random-text:apple&gt;/&lt;random-text:colour&gt; 标记,但我想避免在其他树层次结构中使用相同的标记,例如 &lt;random-text:round-fruits&gt;/&lt;random-text:apple&gt;/&lt;random-text:colour&gt;

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

所以,我想问一下:

    是否可以应用 */apple/color 之类的通配符在 XSL 1.0 中获得所需的行为? 如果是,请提出建议

更新: 抱歉,我之前忘了提到随机文本已正确定义,但我必须为许多此类 xml 文件执行此操作,所以我想要类似:&lt;any-namespace:apple&gt;/&lt;any-namespace:colour&gt; 元素

【问题讨论】:

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 文件这样做,所以我想要类似:/ 元素 查看我的答案。 谢谢,但似乎 1.0 版本不支持 local-name( )? 确定是:w3.org/TR/1999/REC-xpath-19991116/#section-Node-Set-Functions 对不起,我的错。谢谢!

以上是关于如何在 XSLT 中的特定树层次结构中选择标签?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 XSLT 从 XML 中删除元素标记

XSLT如何在层次结构中创建一个包含更多元素的字符串

如何使用 ICollectionView 过滤 wpf 树视图层次结构?

4.15

切换标签栏项目时,UINavigationController 如何将其整个视图控制器表示层次结构保存在内存中?

Mooc数据结构-03树