I. Решение XSLT 1.0:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
>
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:variable name="vReplacement">Default</xsl:variable>
<xsl:variable name="vRep" select=
"document('')/*/xsl:variable[@name='vReplacement']/text()"/>
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="node1[not(node())] | node2[../node1[not(node())]]">
<xsl:copy>
<xsl:copy-of select="../node2/text() | $vRep[not(current()/../node2/text())]"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
Это короче и проще , чем текущие решения - на 7 строк меньше и, что более важно, , на один шаблон меньше , чем текущее выбранное решение.
Что еще более важно , это решение полностью декларативно и работает в стиле push - без вызова именованных шаблонов, и только <xsl:apply-templates>
содержится в правиле идентификации.
II. Решение XSLT 2.0
<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
>
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="node1[not(node())] | node2[../node1[not(node())]]">
<xsl:copy>
<xsl:sequence select="(../node2/text(), 'Default')[1]"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
Используя возможности последовательностей XPath 2.0, это решение значительно короче, чем решение XSLT 1.0 .
Нечто подобное невозможно в XSLT 1.0 (например, выбор первого из объединения двух узлов без указания предикатов, чтобы сделать эти два узла взаимоисключающими), поскольку узел с текстом по умолчанию и Узлы узел1 / узел2 принадлежат разным документам, и, как мы хорошо знаем, упорядочение узлов между узлами разных документов зависит от реализации и не гарантируется / не предписывается.
Это решение полностью декларативное (нет if / then / else) и полностью push-стиль: единственный <xsl:apply-templates>
находится в правиле идентификации.