Как понять синтаксис xslt [не (. = Предыдущий :: *)] - PullRequest
0 голосов
/ 04 марта 2020

Я смотрел на файл XSLT, созданный моим коллегой, и он содержит следующий фрагмент:

<xsl:for-each select="/vpf:Msg/vpf:Body/vpf:Payload[./@id=&apos;atom6&apos;]/row/DocEntry[not(.=preceding::*)]">
                <DocEntry>
                    <xsl:value-of select="."></xsl:value-of>
                </DocEntry>
</xsl:for-each>

Мне было очень трудно понять часть [not(.=preceding::*]
После Читая об использовании якоря preceding, мне кажется, что эта часть вообще ничего не делает. Может ли кто-нибудь помочь мне понять, что мой коллега может попытаться сделать здесь?

Ответы [ 2 ]

3 голосов
/ 04 марта 2020
. = preceding::*

- истина, если значение текущего узла равно значению некоторого предыдущего узла. Здесь необходимо понять четыре концепции, и я не уверен, с какой из них у вас возникли трудности:

  • . означает текущий узел. Вам абсолютно необходимо понять эту концепцию, чтобы вообще понять XPath

  • = в XPath немного необычно: он проверяет, равен ли какой-либо из элементов на lhs любой из элементов в правой части, по сути, X = Y означает, что «некоторый элемент в X равен некоторому элементу в Y`.

  • preceding::* выбирает все элементы, предшествующие текущему элементу в том же документе, в порядке документа. В действительности, если заданы два элемента A и B, A предшествует B, если тег A end появляется в документе раньше, чем тег B start .

  • строковое значение: если к узлам применяется операция типа "=", она фактически работает со строковыми значениями узлов. Для простого элемента, такого как <x>23</x>, строковое значение элемент равен 23.

Итак

not(. = preceding::*)

проверяет, отличается ли элемент от всех предыдущих элементов

и

//*[not(. = preceding::*)]

поэтому выбирает все элементы, которые не являются дубликатами.

Like большинство хитростей в XSLT 1.0, конечно же, становится намного проще с XSLT 2.0 - и даже если у вас есть несчастье застрять в XSLT 1.0, есть более эффективные способы решения проблем группировки с помощью ключей.

0 голосов
/ 04 марта 2020

Я сделал следующий тест на xpather.com после прочтения комментария Джоэля М. Ламсена , он помог мне понять синтаксис:
enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...