В каком порядке делают шаблоны в документе XSLT выполняются, и они соответствуют на источнике XML или буферизированному выводу?

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

у Каждого есть его преимущества со слабым контролем типов (или динамический контроль типов, как это часто называют), будучи более гибким и требуемым меньше кода от программиста. Строгий контроль типов, с другой стороны, требует большего количества работы от разработчика, но в ответ это может предупредить Вас многих ошибок при компиляции кода перед выполнением его. Динамический контроль типов может задержать открытие этих простых проблем, пока код не выполнен.

В зависимости от задачи под рукой, слабый контроль типов может быть лучше, чем строгий контроль типов, или наоборот, но это - главным образом вопрос вкуса. Слабый контроль типов является наиболее часто используемым в языках сценариев, в то время как строгий контроль типов используется на наиболее скомпилированных языках.

66
задан Deane 7 October 2009 в 18:20
поделиться

3 ответа

Мне нравится ваш вопрос. Вы очень четко формулируете то, чего еще не понимаете. Вам просто нужно что-то связать. Я рекомендую вам прочитать «Как работает XSLT» , главу, которую я написал, чтобы точно ответить на вопросы, которые вы задаете. Я хотел бы услышать, связывает ли это для вас все вместе.

Менее формально, я ' текущий вывод XSLT к этому point?

В любой момент обработки XSLT существует, в некотором смысле, два контекста, которые вы определяете как (a) и (b): где вы находитесь в дереве исходных текстов , и где вы находитесь в дереве результатов . Место, где вы находитесь в дереве исходных текстов, называется текущим узлом . Он может меняться и перемещаться по всему дереву исходного кода, когда вы выбираете произвольные наборы узлов для обработки с помощью XPath. Однако концептуально вы никогда не «перепрыгиваете» по дереву результатов таким же образом. XSLT-процессор создает его упорядоченным образом; сначала он создает корневой узел результирующего дерева; затем он добавляет потомков, выстраивая результат в порядке документа (в глубину). [Ваш пост побуждает меня снова взять мою программную визуализацию для экспериментов с XSLT ...]

Порядок шаблонных правил в таблице стилей никогда не имеет значения. Вы можете' Я могу сказать, просто взглянув на таблицу стилей, в каком порядке будут создаваться правила шаблона, сколько раз будет создаваться правило или даже будет ли оно вообще. ( match = "/" является исключением; вы всегда можете знать, что он сработает.)

Я предполагаю, что шаблон № 1 будет выполнить первым. Я не знаю почему я предположить, что это просто потому, что это appears first in the document?

Nope. It would be called first even if you put it last in the document. Template rule order never matters (except under an error condition when you have more than one template rule with the same priority matching the same node; even then, it's optional for the implementor and you should never rely on such behavior). It gets called first because the first thing that always happens whenever you run an XSLT processor is a virtual call to . The one virtual call constructs the entire result tree. Nothing happens outside it. You get to customize, or "configure", the behavior of that instruction by defining template rules.

Will Template #2 execute? It matches a node in the source XML, but by the time the we get to this template (assuming it runs second), the "firstName" node will not be in the output tree.

Template #2 (nor any other template rules) will never get triggered unless you have an call somewhere in the match="/" rule. If you don't have any, then no template rules other than match="/" will get triggered. Think of it this way: for a template rule to get triggered, it can't just match a node in the input. It has to match a node that you elect to process (using ). Conversely, it will continue to match the node as many times as you choose to process it.

Would [the match="/" template] pre-empt all other templates from executing since there is nothing чтобы соответствовать после этого первого шаблона завершено?

Это правило нигде не вытесняет остальных, включая в нем. В исходном дереве все еще есть множество узлов, которые могут быть обработаны. Они всегда все здесь, созрели для сбора; обрабатывайте каждый столько раз, сколько хотите. Но единственный способ обработать их с помощью шаблонных правил - это вызвать .

На данный момент я был обеспокоен с более поздними шаблонами не выполняются потому что узлы, которые они использовали on не отображаются в выводе, но как насчет обратного? Может ли "более ранний" шаблон создает узел, "более поздний" шаблон может что-то сделать with?

It's not that an "earlier" template creates a new node to be processed; it's that an "earlier" template in turn processes more nodes from the source tree, using that same instruction (). You can think of it as calling the same "function" recursively, with different parameters each time (the nodes to process as determined by the context and the select attribute).

In the end, what you get is a tree-structured stack of recursive calls to the same "function" (). And this tree structure is isomorphic to your actual result. Not everyone realizes this or has thought about it this way; that's because we don't have any effective visualization tools...yet.

Template #1 creates a new node called "fullName". Template #2 matches on that same node. Will Template #2 execute because the "fullName" node exists in the output by the time we перейти к шаблону №2?

Нет. Единственный способ выполнить цепочку обработки - это явно настроить ее таким образом. Создайте переменную, например $ tempTree , которая содержит новый элемент , а затем обработайте it , как это . Чтобы сделать это в XSLT 1.0, вам нужно заключить ссылку на переменную в функцию расширения (например, exsl: node-set () ), но в XSLT 2.0 она будет работать как есть.

Независимо от того, обрабатываете ли вы узлы из исходного исходного дерева или во временном дереве, которое вы создаете, в любом случае вам нужно явно указать, какие узлы вы хотите обрабатывать.

Мы не рассмотрели, как XSLT получает все свои неявные поведение. Вы также должны понимать правила встроенного шаблона . Я все время пишу таблицы стилей, которые даже не включают явного правила для корневого узла ( match = "/" ). Вместо этого я полагаюсь на встроенное правило для корневых узлов (применять шаблоны к дочерним узлам), которое аналогично встроенному правилу для узлов элементов. Таким образом, я могу игнорировать большие части ввода, позволить процессору XSLT автоматически проходить его, и только когда он наткнется на интересующий меня узел, я сделаю что-то особенное. Или я мог бы написать одно правило, которое копирует все рекурсивно (называемое преобразованием идентичности), переопределяя его только там, где это необходимо, для внесения дополнительных изменений во входные данные. После того, как вы прочтете «Как работает XSLT», ваше следующее задание - найти «преобразование идентичности».

Я понимаю, что я глубоко невежественен t даже включить явное правило для корневого узла ( match = "/" ). Вместо этого я полагаюсь на встроенное правило для корневых узлов (применять шаблоны к дочерним узлам), которое аналогично встроенному правилу для узлов элементов. Таким образом, я могу игнорировать большие части ввода, позволить процессору XSLT автоматически проходить его, и только когда он наткнется на интересующий меня узел, я сделаю что-то особенное. Или я мог бы написать одно правило, которое копирует все рекурсивно (называемое преобразованием идентичности), переопределяя его только там, где это необходимо, для внесения дополнительных изменений во входные данные. После того, как вы прочтете «Как работает XSLT», ваше следующее задание - найти «преобразование идентичности».

Я понимаю, что я глубоко невежественен t даже включить явное правило для корневого узла ( match = "/" ). Вместо этого я полагаюсь на встроенное правило для корневых узлов (применять шаблоны к дочерним узлам), которое аналогично встроенному правилу для узлов элементов. Таким образом, я могу игнорировать большие части ввода, позволить процессору XSLT автоматически проходить его, и только когда он наткнется на интересующий меня узел, я сделаю что-то особенное. Или я мог бы написать одно правило, которое копирует все рекурсивно (называемое преобразованием идентичности), переопределяя его только там, где это необходимо, для внесения дополнительных изменений во входные данные. После того, как вы прочтете «Как работает XSLT», ваше следующее задание - найти «преобразование идентичности».

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

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

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

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

Я понимаю, что я глубоко невежественен о "дзен" XSLT. На сегодняшний день мои таблицы стилей состояли из шаблон, соответствующий корневому узлу, затем оттуда полностью процедурны. Я устал этим заниматься. я бы скорее на самом деле понимаю XSLT correctly, hence my question.

I applaud you. Now it's time to take the "red pill": read "How XSLT Works"

83
ответ дан 24 November 2019 в 15:05
поделиться

Шаблоны всегда совпадают в исходном XML. Таким образом, порядок не имеет значения, если только 2 или более шаблонов не соответствуют одному и тому же узлу (ам). В этом случае, что несколько противоречит интуиции, срабатывает правило с шаблоном соответствия последним .

6
ответ дан 24 November 2019 в 15:05
поделиться

В вашем 1-м примере шаблон № 1 запускается, потому что, когда вы начинаете обрабатывать входной xml, он начинается с корня, и это единственный шаблон в вашей таблице стилей, который соответствует корневому элементу. Даже если бы он был вторым в таблице стилей, он все равно работал бы 1-м.

В этом примере шаблон 2 не будет выполняться, поскольку вы уже обработали корневой элемент с использованием шаблона 1, и после корневого больше нет элементов для обработки. Если вы действительно хотите обрабатывать другие элементы с помощью дополнительных шаблонов, вы должны изменить его на.

<xsl:template match="/">
  <xsl:apply-templates/>
</xsl:template>

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

Также обратите внимание, что этот пример ничего не выводит, так как в текущем контексте (корне) нет элемента firstName, только элемент person, так что он должен быть:

<xsl:template match="/">
  <xsl:value-of select="person/firstName"/> <xsl:value-of select="person/lastName"/>
</xsl:template>

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

В вашем 2-м примере Шаблон № 2 не будет выполняться, потому что шаблон выполняется для входного xml, а не для вывода.

XSLT преобразует входной документ в выходной, поэтому выходной документ в начале преобразования пуст. Вывод не используется как часть преобразования, это просто вывод от него.

В вашем 2-м примере Шаблон № 2 не будет выполняться, потому что шаблон выполняется для входного xml, а не для вывода.

XSLT преобразует входной документ в выходной, поэтому выходной документ в начале преобразования пуст. Вывод не используется как часть преобразования, это просто вывод от него.

В вашем 2-м примере Шаблон № 2 не будет выполняться, потому что шаблон выполняется для входного xml, а не для вывода.

2
ответ дан 24 November 2019 в 15:05
поделиться
Другие вопросы по тегам:

Похожие вопросы: