В чем смысл фрагмента дерева результатов? - PullRequest
0 голосов
/ 27 октября 2018

XSLT 1.0 добавляет дополнительный тип данных к предоставляемым XPath 1.0: фрагменты дерева результатов.

Этот дополнительный тип данных называется фрагментом дерева результатов.Переменная может быть связана с фрагментом результирующего дерева вместо одного из четырех основных типов данных XPath (строка, число, логическое значение, набор узлов).Фрагмент результирующего дерева представляет собой фрагмент результирующего дерева.Фрагмент дерева результатов обрабатывается эквивалентно набору узлов, который содержит только один корневой узел.Однако операции, разрешенные для фрагмента дерева результатов, являются подмножеством операций, разрешенных для набора узлов.Операция разрешена для фрагмента результирующего дерева, только если эта операция будет разрешена для строки (операция со строкой может включать в себя сначала преобразование строки в число или логическое значение).В частности, нельзя использовать операторы /, // и [] для фрагментов дерева результатов.
- https://www.w3.org/TR/xslt-10/#section-Result-Tree-Fragments

Мне это кажется бессмысленным,Я могу не понять, почему кто-то захочет сделать это !!Фрагменты дерева результатов кажутся просто мусорной версией наборов узлов, требующих двух промежуточных переменных и расширения языка , чтобы позволить программисту обойти это, казалось бы, произвольное ограничение.

Чтобы еще больше использовать бесполезность фрагментов дерева результатов, вот совместимость, которую я украл , собранные для репликации exsl:node-set в MSXSL:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
                xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                xmlns:exsl="http://exslt.org/common"
                xmlns:msxsl="urn:schemas-microsoft-com:xslt"
                exclude-result-prefixes="exsl msxsl">
  <!-- exsl:node-set -->
  <msxsl:script language="JScript" implements-prefix="exsl"><![CDATA[
    this['node-set'] = function (x) {
      return x;
    }
  ]]></msxsl:script>
</xsl:stylesheet>

Это буквально просто возвращает фрагмент результирующего дерева без изменений , предполагая, что MSXSL даже не заботится о реализации фрагмента результирующего дерева как другого типа, а просто обрабатывает его идентично node-set, дополнительно предполагая, что реальногопрежде всего укажите на это!

Почему существуют фрагменты дерева результатов?

  • Что такое сценарий использования?
  • Почему они были добавлены?
  • Почему бы просто не использовать набор узлов?

1 Ответ

0 голосов
/ 27 октября 2018

В то время я не был в Рабочей группе, но следующий обмен может пролить некоторый свет. В апреле 2001 года, во время разработки XSLT 1.1, я спросил WG:

Может ли кто-нибудь попытаться объяснить мне, почему возникает проблема с средство «фрагмент дерева результатов как набор узлов», как определено в XSLT 1,1 WD? Я продолжаю слышать, что это не будет работать с системой типов XPath 2.0, но я не понимаю, почему.

Я вижу, что мы хотим изменить его, чтобы тип данных был "узел" а не "набор узлов", но кроме этого, я не вижу, что проблема.

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

Джеймс Кларк ответил:

Возможно ли, что кто-то задумал покончить с корневым узлом временного дерева и сделать вместо него значение переменной последовательностью узлов, которые в настоящее время моделируются как дочерние элементы этого корня?

Да.

Если да, то почему это изменение будет полезным?

(a) Таким образом, инструкции могут возвращать узлы, не копируя их.

(b) Так что вы можете использовать инструкции, чтобы вернуть вещи, кроме узлы.

Объяснение вещей больше, чем это потребовало бы от меня, чтобы объяснить, как я надеюсь, что XPath, XSLT и XQuery все вместе. В этот точка, позвольте мне просто сказать, что я думаю, что мы должны согласовать элемент конструирование в XSLT и XQuery. Это естественно приведет к их гораздо меньше пропасти между выражениями и инструкциями. я думаю, что это будет так же неловко и неуместно для xsl: переменная для автоматического копирования и переноса значения в корневом узле производится путем создания экземпляра его содержимого, как это было бы для этого сделать к значению, полученному путем оценки выражения, указанного в выберите атрибут.

Я думаю, что РГ изобрела концепцию «фрагментов дерева результатов», потому что она хотела оставить опции открытыми на будущее. У них были идеи, как будет развиваться язык, и они думали, что создание xsl:variable для создания полноценного узла с полной навигационной возможностью ограничит возможности для будущего.

Оглядываясь назад, я убежден, что это была ошибка, потому что на самом деле она не достигла этой цели. Когда мы упразднили RTF в версии 2.0, мы все же сочли необходимым по причинам обратной совместимости иметь причудливое правило, согласно которому xsl:variable всегда создает узел документа, если атрибут «as» отсутствует.

Стоит отметить, что никто в РГ никогда не предполагал, что люди все еще будут использовать XSLT 1.0 двадцать лет спустя. На разработку версии 1.0 ушло около двух лет, и WG полностью ожидала, что в течение двух лет она будет полностью заменена более поздней версией. Поэтому они очень хотели наложить ограничения на язык, если оставляли открытыми опции для следующей версии.

...