#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. Нашел его. Из ссылки я узнал, что предыдущий начинается с дочерних элементов и работает до родителей, насколько это касается номера []. Большое спасибо.