Почему не все шаблоны XSLT выполняются одновременно? - PullRequest
1 голос
/ 25 октября 2009

В этой публикации я не понимаю, почему два блока шаблона не выполняются одновременно во входящем XML. Насколько я могу видеть, XSL рискует вторым шаблоном, выполняющимся для каждого элемента Document, независимо от того, вызывается он с apply-templates или нет.

Может кто-нибудь объяснить это?

Ответы [ 2 ]

1 голос
/ 26 октября 2009

Мадс прав, что один шаблон соответствует только корневому элементу xml, а другой - определенному элементу (Проблемы / Проблемы / Описание). Итак, они работают на разных элементах. Однако, ваш вопрос более общий? Почему два xsl: шаблонов не могут соответствовать конкретному элементу XML, выполняемому для него? Другими словами, почему и шаблон, соответствующий «node ()», и шаблон, соответствующий «Проблемы / Проблема / Описание», не работают с одним и тем же элементом XML «Проблемы / Проблема / Описание»?

Если это так, то вам не хватает ключевой концепции XSLT: priority . Это похоже на порядок операций, которые вы изучили в алгебре (деление, умножение, вычитание, сложение). В XSLT это работает так. Для любого данного элемента XML поведение по умолчанию - обрабатывать его один и только один раз. Задачей движка XSLT является определение всех шаблонов, которые могут воздействовать на отдельный элемент XML, поиск наиболее конкретного и применение только этого шаблона.

То, как определяется специфичность, немного сложно, но в этом примере это просто. Один шаблон соответствует любым узлам (node ​​()), а другой - определенному именованному узлу. Итак, конкретно названный узел выигрывает.

Полные правила приоритета см. В разделе 5.5 спецификации XSLT на W3C. http://www.w3.org/TR/xslt

1 голос
/ 25 октября 2009

Шаблон, соответствующий корневому узлу <xsl:template match="/"> является отправной точкой для преобразования и контролирует, что происходит с этой точки вперед.

Если шаблон для корневого узла не вызывает apply-templates , то вы получите только выходные данные, описанные в этом шаблоне для корневого узла.

Однако, поскольку он вызывает apply-templates , он говорит процессору выполнить все правила шаблона, соответствующие содержимому, с которым он сталкивается. Выражение xpath, указанное в @ select , имеет вид Problems/Problem/Description, что ограничивает содержимое, в котором процессор будет применять правила шаблона для элементов Description .

Итак, поскольку XSLT имеет шаблон, определенный для элементов описания (<xsl:template match="Description"> ), этот шаблон запускается для каждого элемента Description, с которым он сталкивается.

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