Учитывая следующее преобразование XML и XSL, я ожидаю, что в выводе будут два элемента <node/>
, содержащих тексты first
и second
.Это ожидание основано на следующих соображениях:
- Шаблон с
match="/root"
будет выполнен первым.Инструкция <xsl:apply-templates/>
в этом шаблоне будет применять самые специфические шаблоны для всех дочерних узлов . - Эти
<foo/>
дочерние узлы будут обрабатываться вторым шаблоном.Этот шаблон также содержит инструкцию <xsl:apply-templates/>
, которая применяет шаблоны к дочерним узлам этих узлов. - Узлы
<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, и все они показывают «неправильно"результат.Так что, думаю, я здесь не прав, но что не так с моими рассуждениями?