XSL:仅具有某些祖先的后代

时间:2018-12-27 14:43:02

标签: xslt

什么是XSL表达式,它将选择仅以A为祖先的所有B?例如这些(我已经可以通过表达式找到R的位置):

  R/A/B
  R/A/A/B
  R/A/A.../A/B

但不是这个

  R/A/X/A/B

2 个答案:

答案 0 :(得分:1)

在2.0及更高版本中,您可以执行

.//B except .//*[not(self::A)]//B

但是,由于您要求的是XSLT解决方案而不是纯XPath解决方案,因此选择性递归下降以达到相关的B元素可能会更好:

<xsl:template match="A" mode="aab">
  <!-- When we find an A, go on to its children -->
  <xsl:apply-templates select="*"/>
</xsl:template>

<xsl:template match="*" mode="aab">
  <!-- When we find something that isn't an A, go no further -->
</xsl:template>

<xsl:template match="B" mode="aab">
  <!-- This is one of the B elements we are interested in -->
</xsl:template>

答案 1 :(得分:0)

使用以下匹配表达式:

//B[count(ancestor::A) = count(ancestor::*[not(self::R)])]

使用该表达式的XSL模板可能是

<xsl:template match="B[count(ancestor::A) = count(ancestor::*[not(self::R)])]">
  CONDITION FULFILLED!
</xsl:template>