XSL: потомки только с определенным предком - PullRequest
0 голосов
/ 27 декабря 2018

Что такое выражение XSL, которое выберет все B, которые имеют только A в качестве предков?например, эти (где я уже могу найти R с помощью выражения):

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

, но не это

  R/A/X/A/B

Ответы [ 2 ]

0 голосов
/ 27 декабря 2018

В версии 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>
0 голосов
/ 27 декабря 2018

Используйте следующее подходящее выражение:

//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>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...