给出以下(部分)XML文件:
<span deltaxml:deltaV2="A!=B">
<deltaxml:attributes deltaxml:deltaV2="A!=B">
<dxa:class deltaxml:deltaV2="A!=B">
<deltaxml:attributeValue deltaxml:deltaV2="B">LoF</deltaxml:attributeValue>
</dxa:class>
</deltaxml:attributes>
Some Text
</span>
...我希望/需要匹配<span>
语句中那些特定跨度的<xsl:template match="..">
个节点
基本上我需要匹配上面显示的这个确切条件,以便稍后选择/使用'Some Text'部分..但是一旦我匹配输入xml中的<span>
节点,那就很容易了..但到目前为止,我一直在挠头,未能选择节点。
也许任何人都能说一些稍微复杂一点的比赛声明,并知道哪一个是正确的。谢谢!
答案 0 :(得分:0)
您可以创建一个大的谓词表达式and
来计算和计算属性。节点不必直接匹配,因为没有元素的属性不能存在。但是,计算元素和属性以确保span
/元素中没有更多或更少的元素/属性。不处理文本节点,仅检查是否存在Some Text
。
所以下面的复杂表达式确实匹配 你所描述的元素/属性树结构:
<xsl:template match="span[
@deltaxml:deltaV2='A!=B' and
count(descendant::*)=3 and
deltaxml:attributes/@deltaxml:deltaV2 and
count(deltaxml:attributes/@*)=1 and
deltaxml:attributes/dxa:class/@deltaxml:deltaV2 and
count(deltaxml:attributes/dxa:class/@*)=1 and
deltaxml:attributes/dxa:class/deltaxml:attributeValue/@deltaxml:deltaV2='B' and
count(deltaxml:attributes/dxa:class/deltaxml:attributeValue/@*)=1 and
deltaxml:attributes/dxa:class/deltaxml:attributeValue/text()='LoF' and
normalize-space(text()[2])='Some Text']">
MATCH!
</xsl:template>
不幸的是,在包含子树的变量中比较两个结果树片段不起作用,因为它没有 compare-op (see here)。