gpt4 book ai didi

xml - xpath 中的节点集

转载 作者:数据小太阳 更新时间:2023-10-29 01:48:47 24 4
gpt4 key购买 nike

我正在编写一个 xslt 样式表以将一个 xml 转换为另一个 xml。

这是原始 xml 的简化版本:

 <eml>
<datatable>
<physical>
<distribution id="100"/>
</physical>
</datatable>

<software>
<implementation>
<distribution id="200"/>
</implementation>
</software>
<additionalMetadata>
<describes>100</describes>
<describes>200</describes>
<describes>300</describes>
<describes>400</describes>
</additionalMetadata>
</eml>

我尝试使用 Xpath 来选择不具有等于 //physical/distributionsoftware/implementation 的 id 值的值的节点集/分布。在上面的例子中,我想获取节点集:

   <deseribes>300</describes>
<deseribes>400</describes>

(100和200是//physical/distributionsoftware/implementation/distribution的属性id值)。

我写的是这样的:

<xsl:with-param name="describes-list" 
select="./describes[//physical/distribution/@id !=. and
//software/implementation/distribution/@id != .] "/>

它适用于上面的例子。但是,数据表和软件的元素是可重复的。所以这个 xml 是有效的:

<eml>
<datatable>
<physical>
<distribution id="100"/>
</physical>
</datatable>

<datatable>
<physical>
<distribution id="300"/>
</physical>
</datatable>

<software>
<implementation>
<distribution id="200"/>
</implementation>
</software>
<additionalMetadata>
<describes>100</describes>
<describes>200</describes>
<describes>300</describes>
<describes>400</describes>
</additionalMetadata>
</eml>

但是我的 xslt 在上面的例子中不起作用:(

您介意说明一下吗?提前致谢!

最佳答案

这是一个经常犯的错误。永远不要使用 XPath's "!=" operator当一个或两个操作数是/是节点集时。

value != node-set

根据定义如果节点集中存在节点 n 则为真,这样

value 不等于 string(n)

你想要的是那个

value 不等于节点集中的任何节点。

这可以用下面的方式表达:

value = node-set

如果节点集中至少存在一个节点 n 则为真,这样:

value = string(n)

然后

not(value = node-set)

如果节点集中不存在任何节点 n 则为真,这样

value = string(n)

因此,以下 XPath 表达式将选择所需的节点:

 /*/*/describes[not(. = ../../*/physical/distribution/@id)              and                 not(. = ../../*/implementation/distribution/@id)]

我个人更愿意将上下文节点与两个节点集的并集进行一次比较:

 /*/*/describes            [not(. = (../../*/physical/distribution/@id                    |                       ../../*/implementation/distribution/@id                     )                 )            ]

请注意,我避免使用“//”缩写。它通常非常昂贵(低效),只有在我们不知道 XML 文档的结构时才应使用。

当然,上述 XPath 表达式必须针对以下 XML 文档(问题中提供的第二个文档)进行评估:

<eml>    <datatable>        <physical>            <distribution id="100"/>        </physical>    </datatable>    <datatable>        <physical>            <distribution id="300"/>        </physical>    </datatable>    <software>        <implementation>            <distribution id="200"/>        </implementation>    </software>    <additionalMetadata>        <describes>100</describes>        <describes>200</describes>        <describes>300</describes>        <describes>400</describes>    </additionalMetadata></eml>

关于xml - xpath 中的节点集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/332449/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com