Xml xpath中的节点集
我正在编写一个xslt样式表来将一个xml转换为另一个xml 以下是原始xml的简化版本:Xml xpath中的节点集,xml,xslt,xpath,Xml,Xslt,Xpath,我正在编写一个xslt样式表来将一个xml转换为另一个xml 以下是原始xml的简化版本: <eml> <datatable> <physical> <distribution id="100"/> </physical> </datatable>
<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>
(100和200是//物理/分销
或软件/实施/分销
的属性id值)
我写了这样的东西:
<xsl:with-param name="describes-list"
select="./describes[//physical/distribution/@id !=. and
//software/implementation/distribution/@id != .] "/>
它适用于上述示例。然而,datatable和软件的元素是可重复的。因此,此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>
100
200
300
400
但我的xslt在上述示例中不起作用:(
你介意解释一下吗?先谢谢你
Jing这是一个经常犯的错误。当一个或两个操作数都是节点集时,切勿使用
value!=节点集
根据定义,如果节点集中存在一个节点n,那么
值
不等于字符串(n)
你想要的是
值
不等于节点集中的任何节点
这可以用以下方式表示:
value=节点集
如果节点集中至少存在一个节点n,则为true,例如:
value=string(n)
然后
not(值=节点集)
如果节点集中不存在任何节点n,则为true
value=string(n)
因此,以下XPath表达式将选择所需的节点:
/*/*/describes[not(. = ../../*/physical/distribution/@id)
and
not(. = ../../*/implementation/distribution/@id)]
/*/*/描述[非(..=../../*/physical/distribution/@id)
及
不是(..=../../*/implementation/distribution/@id)]
我个人更喜欢将上下文节点与两个节点集的并集进行一次比较:
/*/*/describes
[not(. = (../../*/physical/distribution/@id
|
../../*/implementation/distribution/@id
)
)
]
/*/*/描述
[非(.=(../../*/physical/distribution/@id)
|
../../*/implementation/distribution/@id
)
)
]
请注意,我避免使用“/”缩写。它通常非常昂贵(效率低下),只有在我们不知道XML文档的结构时才应该使用
当然,上述XPath表达式必须根据以下XML文档(问题中提供的第二个文档)进行评估:
100
200
300
400
/*/*/describes
[not(. = (../../*/physical/distribution/@id
|
../../*/implementation/distribution/@id
)
)
]
<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>