Насколько я понимаю, в XSL обычно на каждый узел может влиять только один
шаблон. Как только узел был затронут шаблоном,
это - и, что особенно важно, его дети / потомки - не затронуты
далее по любым другим шаблонам.
Ни одно из этих утверждений не соответствует действительности . Различные шаблоны могут быть выбраны для выполнения на одном и том же узле - все это зависит от инструкций <xsl:apply-templates>
, которые приводят к выбору конкретного шаблона для выполнения. Способ применения и выбора шаблонов очень велик, например, приоритет импорта, приоритет, режимы и т. Д.
Можно даже сделать шаблоны двойными для узлов (используемых в качестве узла), как это сделано в FXSL.
Иногда, однако, вы хотите воздействовать на внешний узел одним шаблоном,
затем воздействуйте на своих потомков / потомков другим шаблоном. Будет ли
Следующее будет целесообразным способом обойти это? Его цель - добавить
атрибут "attr" для каждого узла.
Это тривиально достигается с помощью самого основного шаблона проектирования XSLT - переопределения правила идентификации :
<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="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="*">
<xsl:variable name="val" select="count(ancestor::node())"/>
<xsl:copy>
<xsl:attribute name="depth">
<xsl:value-of select="$val"/>
</xsl:attribute>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
Когда это преобразование применяется к предоставленному документу XML (исправлено, чтобы оно было правильно сформировано):
<root>
<child>
<grandchild>
<greatgrandchild>hello! </greatgrandchild>
</grandchild>
</child>
</root>
копирует каждый узел и добавляет атрибут depth
к каждому элементу. Значением добавленного атрибута является «глубина» элемента :
<root depth="1">
<child depth="2">
<grandchild depth="3">
<greatgrandchild depth="4">hello! </greatgrandchild>
</grandchild>
</child>
</root>