Что это означает, что набор узлов неупорядочен? - PullRequest
2 голосов
/ 31 января 2012

Я часто вижу, что в XSLT 1.0 набор узлов неупорядочен, но также и то, что узлы в наборе узлов обрабатываются в порядке документа.

Звучит так, будто набор узлов упорядочен в порядке документа.

Если существует разница между «неупорядоченным, но обработанным в порядке документов» и «упорядоченным по порядку документов», когда я должен на самом деле беспокоиться об этой разнице?

1 Ответ

0 голосов
/ 01 февраля 2012

Набор и последовательность очень разные.

В последовательности один и тот же предмет может присутствовать более одного раза.

По определению все элементы набора различны - не может быть пары элементов $it1 и $it2 в наборе, такой что identical(@it1, $it2).

Давайте иметь этот XMLdocument:

<a>
 <b>
  <a>
    <c>
      <a/>
    </c>
  </a>
 </b>
</a>

и это выражение XPath:

//a/ancestor-or-self::a

При этом выбираются три узла, однако, если результатом оценки была последовательность, результирующая последовательность будет содержать шесть узлов.

Если есть разница между «неупорядоченным, но обработанным в порядке документов» и «упорядоченным в порядке документов», когда я должен действительно беспокоиться об этой разнице?

Есть впо крайней мере две вещи, о которых нужно знать:

  1. набор узлов не совпадает со списком узлов .Список узлов может иметь порядок, который отличается от порядка документов узлов, которые он содержит - например, список узлов для xsl:apply-templates и / или xsl:for-each, когда эти инструкции имеют дочерний элемент xsl:sort.Этот список узлов в общем случае отличается от порядка документов.

  2. Порядок документов не является отношением общего порядка заказа .Например, позиции двух узлов атрибутов (одного и того же элемента) определяются реализацией и могут различаться для разных реализаций XPath.Кроме того, «порядок документов» между двумя узлами, каждый из которых принадлежит отдельному документу, не определен и зависит от различных реализаций XPath / XSLT.

В XSLT 2.0 / XPath 2.0 можно получитьочень неожиданный и сбивающий с толку результат, если он использует последовательность узлов в месте, где ожидается набор узлов - узлы в последовательности будут дедуплицированы и будут дополнительно обрабатываться не в порядке их последовательности, а в порядке документов.

...