<xsl:if test="not(@caption = preceding-sibling::@caption)">
Это будет проверять, равен ли заголовок атрибуту заголовка, который является родственным узлом контекстного узла, то есть родственным элементом обрабатываемого элемента ограничения. Но я подозреваю, что он «не работает» с синтаксической ошибкой, потому что шаг заголовка имеет две оси: preceding-sibling::
и attribute::
(для которого @ означает сокращение).
То, что вы, вероятно, хотите, это
<xsl:if test="not(@caption = preceding-sibling::constraint[1]/@caption)">
Это будет делать то, что вы хотите, это проще, чем Muenchian, и это, вероятно, достаточно быстро, если реализация XPath в браузере приличная, потому что ему нужно тестировать только один другой узел, а не все предыдущие узлы ограничения.
Если эта стратегия не достаточно быстра для ваших целей, например, если у вас много данных, вы можете использовать мюнхенскую группировку, как сказал @ Frédéric.
Добавление: [1]
является сокращением для [position() = 1]
. Здесь это означает, что в правой части =
у нас есть только @caption of ограничение непосредственно , предшествующее текущему элементу. Если бы мы пропустили [1]
, мы сравнили бы значение @caption текущего элемента с @captions all , предшествующих элементам ограничения родственного элемента.
Важно понимать, что оператор XPath =
работает с наборами узлов (когда есть шанс), а не только с отдельными значениями или узлами. Таким образом, A = B
, где A и B являются наборами узлов, возвращает true, если существует любой член набора узлов A, равный любому члену набора узлов B. Это скорее похоже на соединение в SQL. Это мощная операция, но вы должны осознавать, что она делает.
Еще одна деталь ... Почему [1]
дает элемент ограничения , непосредственно предшествующий текущему, вместо первого в документе? Потому что position()
отражает направление текущей оси, которое в данном случае равно preceding-sibling
. Как сказано в спецификации XPath ,
ось, которая только когда-либо содержит
узел контекста или узлы, которые находятся до
контекстный узел в порядке документа
обратная ось . Таким образом, предок,
предок или сам, предшествующий и
предшествующий брат оси обратные
оси; все остальные оси являются прямыми.
...
Близость положения члена
набор узлов относительно оси
определяется как позиция узла
в наборе узлов, упорядоченном в документе
порядок, если ось является передней осью
и заказано в обратном порядке документа
если ось является обратной осью.
первая позиция 1.
НТН.