2012-05-23 1 views
1

У меня есть две переменные в моем шаблоне xslt 1.0, каждый из которых содержит набор узлов (выбран из xpath). Я хочу определить, содержится ли узел в одной переменной в узле, установленном в другом. Например, предположим, что у меня есть глава с вложенными разделами. Я хочу, чтобы увидеть, если $b содержится в $a:Имеет ли xpath nodeet еще один

<xsl:variable name="a" select="chapter//section" /> 
<xsl:variable name="b" select="chapter//section" /> 

Я попытался получить пересечение nodesets, чтобы увидеть, если $a является первым общим элементом разделяют как $a и $b, но это не работает:

<xsl:if test="$a/ancestor-or-self::*[count(.|$b) = count($b/ancestor::*)][1] = $a"> 

Добавление некоторого контекста. Я создаю интерфейс с вкладками для дерева html-страниц с этим xslt, и проблема, которую я пытаюсь решить, - поставить class = "current" на соответствующую вкладку. Проверяя каждый раздел, чтобы узнать, является ли он дочерним элементом раздела вкладки, он получает класс = «текущий», и поэтому вкладка будет выглядеть так, как будто она находится сверху.

ответ

2

Чтобы расширить хороший ответ Майкла Кея:

Когда узел $n принадлежит узлу набора $ns?

Если узел принадлежит узлу, то объединение узла с набором узлов не приводит к большему набору узлов, поэтому количество узлов в объединении не должно быть больше (на самом деле должно быть равно), чем количество узлов в исходном наборе узлов.

Чтобы выразить это с выражением XPath:

count($n | $ns) = count($ns) 

Теперь та же логика говорит нам о том, что множество узлов $ns1 является подмножеством множества узлов $ns2 точно, когда объединение двух node- наборы не содержат больше элементов, чем больше набор узлов:

count($ns1 | $ns2) = count($ns2) 

Если мы хотим, чтобы проверить, еслиявляется истинного подмножеством $ns2:

count($ns1 | $ns2) = count($ns2) 
    and 
    count($ns2) > count(ns1) 
3

Я думаю, вы можете просто использовать count($a) = count($a|$b). Если в $ b есть какие-либо узлы, которые не входят в $ a, то подсчеты будут разными.

+0

Спасибо за ваш ответ. Я добавил некоторый контекст к вопросу, потому что мне трудно объяснить. Если я только рассчитываю узлы, мне кажется, что следующее приведет к путанице, поскольку каждый родитель имеет такое же число дочерних узлов. Я не понимаю?

Раздел A
Раздел A.1
Раздел B
Раздел B.1
Tim

+0

@ Тим: Ваша главная проблема заключается в том, что вы Бесполезный Попробуйте выражение XPath в ответе - если вы d сделал это, вы не будете задавать такие вопросы в комментариях. Выражение в этом ответе является самым прямым (и самым коротким) способом проверки включения узла. Вы пытаетесь найти другие способы, и они могут работать в одной ситуации, но не в другом - это может быть не самый полезный способ провести время. Для получения дополнительной информации читайте здесь: http://www.dpawson.co.uk/xsl/sect2/muench.html#d9944e108. +1 от меня. –

+0

@Dimitre, я не * понимать * ответ. Благодаря вам и Майклу я теперь вижу, что '|' является оператором объединения, и я думал, что это просто логический 'или'. Я поддержал ответ Майкла и принял твое. Я изучаю. Для моей конкретной ситуации я думаю, что мое решение в порядке, но это не ответ на мой оригинальный вопрос. – Tim

0

Я смог решить проблему, используя другой метод. Я проверить каждый предок элемент $b, имеет ли это тот же XML: идентификатор, как $a:

<xsl:if test="boolean($b/ancestor-or-self::[@xml:id=$a/@xml:id])"> 

Хотя это не используется пересечение, это сказать $a, содержит ли $b.