Это, вероятно, самая частая проблема, с которой сталкиваются даже опытные программисты XSLT.
Наблюдаемое поведение в точности соответствует поведению XSLT-совместимого процессора.
Примите во внимание, что:
<xsl:apply-templates/>
является аббревиатурой для:
<xsl:apply-templates select="child::node()"/>
и наличие встроенных шаблонных правил . В соответствии с XSLT 1.0 Spec .:
" 5.8 Встроенные правила шаблонов
Существует встроенное правило шаблона, позволяющее продолжить рекурсивную обработку при отсутствии успешного сопоставления с образцом с помощью явного правила шаблона в таблице стилей. Это шаблонное правило применяется как к узлам элемента, так и к корневому узлу. Ниже показан эквивалент встроенного правила шаблона:
<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()"/>
Встроенное шаблонное правило для узлов пространства имен также ничего не делает. Нет шаблона, который мог бы соответствовать узлу пространства имен; Итак, встроенное шаблонное правило является единственным шаблонным правилом, которое применяется к узлам пространства имен.
Встроенные правила шаблона обрабатываются так, как если бы они были неявно импортированы до таблицы стилей, и поэтому имеют более низкий приоритет импорта , чем все другие правила шаблона. Таким образом, автор может переопределить встроенное шаблонное правило , включив явное шаблонное правило
«
--- Конец XSLT Spec цитаты ---
Итак, если автор хочет полностью контролировать обработку XSLT, он должен переопределить все встроенные шаблоны .
Например, если мы не хотим, чтобы text()
узлы копировались в вывод, мы можем заставить их игнорироваться, переопределив встроенный шаблон следующим образом:
<xsl:template match="text()" />