これと同じくらい簡単です (条件付き命令なしxsl:element
、 no starts-with()
、 no 、preceding-sibling::
軸なし、モードなし、標準の同一性規則をオーバーライドする 1 つのテンプレートのみ):
<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()|@*" name="identity">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="*[self::tag1 or self::tag2 or self::tag3][1]">
<h2>Heading</h2>
<xsl:call-template name="identity"/>
</xsl:template>
</xsl:stylesheet>
この変換が次の XML ドキュメントに適用される場合(提供されたフラグメントは、単一の最上位要素にラップされ、整形式の XML ドキュメントになります):
<t>
<tag1>Something</tag1>
<tag2>Something else</tag2>
<tag3>...</tag3>
</t>
必要な正しい結果が生成されます。
<t>
<h2>Heading</h2>
<tag1>Something</tag1>
<tag2>Something else</tag2>
<tag3>...</tag3>
</t>
注意してください:
多くの要素名がある場合 (必ずしも同じ文字列で始まるとは限りません)、次のように最後のテンプレートの一致パターンを書き換える方が短く実用的です。
<xsl:template match=
"*[contains('|tag1|tag2|tag3|', concat('|',name(),'|'))][1]">