Я думал, что увидел ошибку в ответе this question и указал на нее. Мне сказали, что я ошибался, и мой ответ был удален.Соответствующие дочерние элементы в XSL
Я все еще не понимаю, как я ошибался. Поэтому я размещаю здесь и надеюсь, что кто-то может объяснить мне свое недоразумение.
Ответ, на который я ответил, объяснил использование шаблонов apply-templates. Он содержал следующие XML и XSL, описывая, как шаблоны будут соответствовать:
<!-- sample XML snippet -->
<xml>
<foo /><bar /><baz />
</xml>
<!-- sample XSLT snippet -->
<xsl:template match="xml">
<xsl:apply-templates select="*" /> <!-- three nodes selected here -->
</xsl:template>
<xsl:template match="foo"> <!-- will be called once -->
<xsl:text>foo element encountered</xsl:text>
</xsl:template>
<xsl:template match="xml/*"> <!-- will be called twice -->
<xsl:text>other element countered</xsl:text>
</xsl:template>
Мой комментарий был, что последний шаблон в должен быть:
<xsl:template match="*"> <!-- will be called twice -->
<xsl:text>other element countered</xsl:text>
</xsl:template>
, потому что текущий узел уже <xml>
мне сказали:
Нет, XML/* это шаблон, который соответствует дочерние элементы элемента с имя xml.
Тестирование оригинальный ответ
Однако с этим XML:
<xml>
<foo /><bar /><baz />
</xml>
И этот XSL таблицы стилей (заполнение фрагмента кода выше):
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text"/>
<xsl:template match="xml">
<xsl:apply-templates select="*" /> <!-- three nodes selected here -->
</xsl:template>
<xsl:template match="foo"> <!-- will be called once -->
<xsl:text>foo element encountered.
</xsl:text>
</xsl:template>
<xsl:template match="xml/*"> <!-- will be called twice -->
<xsl:text>other element countered.
</xsl:text>
</xsl:template>
</xsl:stylesheet>
Я получаю :
other element countered.
other element countered.
other element countered.
Тестирование мой 'исправленную' версию
Если я заменить последний шаблон с:
<xsl:template match="*"> <!-- will be called twice -->
<xsl:text>other element countered.
</xsl:text>
</xsl:template>
как на мой ответ, я получаю:
foo element encountered.
other element countered.
other element countered.
, который, казалось бы, быть верным.
Надеюсь, мой вопрос не нарушит никаких рекомендаций, но я не вижу, что я ошибаюсь и надеюсь, что кто-то сможет объяснить его более полно.
PS. Я боюсь, что мой оригинальный ответ на другой вопрос был отправлен как ответ, а не комментарий, так как у меня недостаточно очков, чтобы оставлять комментарии. Я не был уверен, что лучше всего делать ...
Спасибо, что нашли эту тупую ошибку, теперь она исправлена в другой теме. Это оставалось незамеченным всеми, кто смотрел на ответ на протяжении многих лет. – Tomalak