почему бывший код выхода TEXT, почему я настаиваю XSL игнорировать все другой текст? является то, что поведение всех парсеров XML или только моего собственного
Вы обнаруживаете один из самых основных функций XSLT, как указано в спецификации: в built-in templates of XSLT.
От the Spec:
Существует встроенное правило шаблона для позволяют рекурсивной обработке продолжать в отсутствии успешного матча картины явного правило шаблона в стилях. Это правило шаблона применяется как к узлам элементов, так и к корневому узлу . Ниже показан эквивалента встроенного шаблона правила:
<xsl:template match="*|/">
<xsl:apply-templates/>
</xsl:template>
Существует также встроенное правило шаблона для каждого режима, что позволяет рекурсивная обработки продолжать в том же режиме в отсутствие успешного соответствия шаблону шаблоном правило в таблице стилей. Этот шаблон правило применяется к обоим узлам элемента и корневого узла. Ниже показано эквивалент встроенного шаблона для режима m.
<xsl:template match="*|/" mode="m">
<xsl:apply-templates mode="m"/>
</xsl:template>
Существует также встроенное правило шаблона для текста и атрибуты узлов, копирует текст с помощью:
<xsl:template match="text()|@*">
<xsl:value-of select="."/>
</xsl:template>
Встроенных шаблонного правила для инструкции по обработке и комментарии заключается в ничего не делать.
<xsl:template match="processing-instruction()|comment()"/>
Встроенный шаблонное правило для узлов пространства имен также не делать ничего. Нет шаблона, который может соответствовать узлу пространства имен ; поэтому, правило шаблона является единственным правилом шаблона , которое применяется для пространства имен узлов.
Встроенные шаблонные правила являются как если бы они были импортированы неявно перед таблицей стилей и поэтому имеют более низкий приоритет импорта, чем все остальные правила шаблона. Таким образом, автор может переопределить встроенное правило шаблона , включив в него явное правило шаблона .
Таким образом, сообщаемое поведение является результатом применения встроенных шаблонов - 1-го и 2-го из всех трех из них.
Это хороший шаблон дизайна XSLT переопределять встроенные шаблоны со своим собственным, который будет выдавать сообщение об ошибке, когда названных так, что программист сразу знает, что его преобразование является «утечка»:
Для пример, если этот XML-документ:
<a>
<b>
<c>Don't want to see this</c>
</b>
</a>
и обрабатывается с этим преобразованием:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="a|b">
<xsl:copy>
<xsl:attribute name="name">
<xsl:value-of select="name()"/>
</xsl:attribute>
<xsl:apply-templates/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
результат:
<a name="a">
<b name="b">Don't want to see this</b>
</a>
и программист будет очень смущен, как нежелательный текст появился.
Однако, просто добавив этот catch-all template
помогает избежать подобной путаницы и отлавливать ошибки сразу:
<xsl:template match="*">
<xsl:message terminate="no">
WARNING: Unmatched element: <xsl:value-of select="name()"/>
</xsl:message>
<xsl:apply-templates/>
</xsl:template>
Теперь, помимо запутанной выход программист получает предупреждение, что объясняет проблему немедленно:
WARNING: Unmatched element: c
+1: Отличное объяснение - гораздо более полное, чем принятый ответ, хотя принятый ответ также отвечает на конкретный вопрос. –
@donroby: Спасибо. Почему мой ответ не будет затрагивать вопрос и отвечать на него? Любой, кто имеет эту проблему и читает мой ответ, поймет причину своей проблемы и сможет ее исправить. –
@donroby: Мой ответ дает точный ответ: «Итак, сообщаемое поведение является результатом применения встроенных шаблонов - 2 из всех трех из них» ' –