Шаблон XSL обрабатывает всех потомков, а не только детей - PullRequest
1 голос
/ 20 июля 2010

Учитывая следующее преобразование XML и XSL, я ожидаю, что в выводе будут два элемента <node/>, содержащих тексты first и second.Это ожидание основано на следующих соображениях:

  1. Шаблон с match="/root" будет выполнен первым.Инструкция <xsl:apply-templates/> в этом шаблоне будет применять самые специфические шаблоны для всех дочерних узлов .
  2. Эти <foo/> дочерние узлы будут обрабатываться вторым шаблоном.Этот шаблон также содержит инструкцию <xsl:apply-templates/>, которая применяет шаблоны к дочерним узлам этих узлов.
  3. Узлы <foo/> содержат только <bar/> узлов, которые не соответствуют ни одному шаблону.Это означает, что дальнейшие узлы не будут обрабатываться.

XML

<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet type="text/xsl" href="style.xsl"?>
<root>
  <foo name="first">
    <bar>
      <foo name="nested"/>
    </bar>
  </foo>
  <foo name="second">
    <bar>
      <baz>
        <foo name="nested"/>
      </baz>
    </bar>
  </foo>
</root>

XSL

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
  <xsl:template match="/root">
    <output>
      <xsl:apply-templates/>
    </output>
  </xsl:template>
  <xsl:template match="foo">
    <node>
      <xsl:value-of select="@name"/>
    </node>
    <xsl:apply-templates/>
  </xsl:template>
</xsl:stylesheet>

Однако фактический результат указанного преобразования содержит четыре элемента <node/>, два из которых содержат текст nested.Это означает, что второй шаблон также применяется к самым внутренним <foo/> узлам.Но согласно вышеупомянутому шагу 3, обработчик никогда не должен достигать этих узлов.

Я протестировал преобразование в нескольких веб-браузерах и с помощью плагина Notepad ++ XML Tools, и все они показывают «неправильно"результат.Так что, думаю, я здесь не прав, но что не так с моими рассуждениями?

Ответы [ 2 ]

3 голосов
/ 20 июля 2010

Но узлы стержней соответствуют шаблону, они соответствуют встроенному шаблону "*", который распространяет шаблоны, вызывая внутренний шаблон стержня / узла

1 голос
/ 20 июля 2010

Предполагается, что сопоставление шаблонов выполняется в соответствии с уровнями вложенности.Это не так.

<xsl:template match="foo">

Это соответствует всем foo элементам независимо от их уровня вложенности, поэтому при вызове apply-templates все элементы foo будут использовать этот шаблон.

Встроенные в шаблон правила также приведут к совпадению узлов bar.

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