XSL XPATH: сравнить предыдущий атрибут узла с текущим атрибутом узла

#xml #xslt #xpath #xslt-1.0 #xslt-2.0

#xml #xslt #xpath #xslt-1.0 #xslt-2.0

Вопрос:

Я пытаюсь выяснить, как я могу сравнить предыдущее значение атрибута узла с текущим. Вот как я пытаюсь в настоящее время:

 <xsl:if test="not(preceding::*[1][@title=text()[self::*[@title]]])">
  

И для справки, вот формат практически каждого узла:

 <item title="myTitle" page="X" link="__WKANCHOR_1i" backLink="__WKANCHOR_1j"/>
  

В принципе, я хочу, чтобы тест завершился неудачей, если предыдущий узел соответствует названию текущего узла.

Спасибо!

Редактировать:

Вот как форматируется весь XML-документ:

 <item title="myTitle" page="8" link="__WKANCHOR_w" backLink="__WKANCHOR_x">
  <item title="mySubTitle" page="8" link="__WKANCHOR_y" backLink="__WKANCHOR_z">
    <item title="mySubSubTitle" page="8" link="__WKANCHOR_10" backLink="__WKANCHOR_11"/>
  </item>
</item>
<item title="myTitle" page="8" link="__WKANCHOR_w" backLink="__WKANCHOR_x">
  <item title="mySubTitle" page="8" link="__WKANCHOR_y" backLink="__WKANCHOR_z">
    <item title="mySubSubTitle" page="8" link="__WKANCHOR_10" backLink="__WKANCHOR_11"/>
  </item>
</item>
  

Все это снова и снова. Итак, я нахожусь на втором узле mySubSubTitle и хочу убедиться, что непосредственно перед ним нет другого узла mySubSubTitle. Я не могу использовать previous-sibling, поскольку, хотя он находится на том же уровне вложенности, он вложен в другой набор.

Ответ №1:

При использовании test="not(@title = preceding::*/@title)" вы сравниваете title атрибут контекстного узла с любым предыдущим. Однако вы можете захотеть предоставить более подробную информацию о структуре ввода и тесте, который вам нужно выполнить, возможно, вы хотите проверить только предыдущие родственные элементы test="not(@title = preceding-sibling::*/@title)" или даже только непосредственно предшествующий родственный элемент test="not(@title = preceding-sibling::*[1]/@title)" .

Комментарии:

1. Этот тест — именно то, что я пытался, но вы правы, я не в правильном настроении, используя его. Я отредактирую с некоторым дополнительным контекстом.

2. Отредактировано. Спасибо за вашу помощь до сих пор.

3. Учитывая вложенность и имеющийся у вас образец, вы действительно хотите использовать preceding ось, как предложено с test="not(@title = preceding::*/@title)" . Можете ли вы показать нам XSLT, где вы его используете, и объяснить, какой вывод вы получаете и какой вы хотите, поскольку, похоже, в настоящее время предложение не работает для вас.

4. Прямо сейчас тест проходит во всех случаях, поскольку я не могу точно передать в него значение true. Я экспериментировал с test="not(@title = preceding::*[2]/@title)" использованием 2 как разных целых чисел, чтобы попытаться напрямую сравнить его с другим узлом mySubSubTitle, но не достиг цели.

5. Нашел его. Из ссылки я узнал, что предыдущий начинается с дочерних элементов и работает до родителей, насколько это касается номера []. Большое спасибо.