XSL:模板&结合两个匹配条件来选择外部节点

时间:2017-08-20 12:06:00

标签: xml xslt xslt-1.0

给出以下(部分)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="..">个节点

  • 跨度本身具有 deltaxml:deltaV2 属性,并带有' A!= B '值以及
  • 确切的 deltaxml:attributes / dxa:class / deltaxml:attributeValue 子结构,其最内层的 deltaxml:attributeValue 节点具有 deltaxml:deltaV2 < / em>属性设置为“ B ”值,并且还包含“ LoF ”作为其值/文本

基本上我需要匹配上面显示的这个确切条件,以便稍后选择/使用'Some Text'部分..但是一旦我匹配输入xml中的<span>节点,那就很容易了..但到目前为止,我一直在挠头,未能选择节点。

也许任何人都能说一些稍微复杂一点的比赛声明,并知道哪一个是正确的。谢谢!

1 个答案:

答案 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)。