I.この変換:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:template match="t[@max-time > @min-time]">
<span>
<xsl:value-of select=
"concat('for ', @min-time, ' to ', @max-time, ' minutes')"/>
</span>
<xsl:apply-templates select="@setting"/>
<xsl:text>.</xsl:text>
</xsl:template>
<xsl:template match="@setting">
<span>
<xsl:value-of select="concat(' on ', ., ' heat')"/>
</span>
</xsl:template>
</xsl:stylesheet>
次のXMLドキュメントに適用した場合(何も表示されていません!):
<t min-time="2" max-time="3" setting="moderate"/>
必要な正しい結果を生成します。
<span>for 2 to 3 minutes</span>
<span> on moderate heat</span>.
そしてそれはブラウザによって次のように表示されます:
適度な熱で2〜3分間。
同じ変換がこのXMLドキュメントに適用される場合:
<t min-time="2" max-time="3"/>
ここでも、正しい、必要な結果が生成されます。
<span>for 2 to 3 minutes</span>.
そしてそれはブラウザによって次のように表示されます:
2〜3分間。
II。レイアウト(ビジュアル)ソリューション:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:my="my:my" xmlns:gen="gen:gen" xmlns:gen-attr="gen:gen-attr"
exclude-result-prefixes="my gen">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<my:layout>
<span>for <gen-attr:min-time/> to <gen-attr:max-time/> minutes</span>
<gen-attr:setting><span> on <gen:current/> heat</span></gen-attr:setting>
<gen:literal>.</gen:literal>
</my:layout>
<xsl:variable name="vLayout" select="document('')/*/my:layout/*"/>
<xsl:variable name="vDoc" select="/"/>
<xsl:template match="node()|@*">
<xsl:param name="pCurrent"/>
<xsl:copy>
<xsl:apply-templates select="node()|@*">
<xsl:with-param name="pCurrent" select="$pCurrent"/>
</xsl:apply-templates>
</xsl:copy>
</xsl:template>
<xsl:template match="/">
<xsl:apply-templates select="$vLayout">
<xsl:with-param name="pCurrent" select="$vDoc/*"/>
</xsl:apply-templates>
</xsl:template>
<xsl:template match="gen-attr:*">
<xsl:param name="pCurrent"/>
<xsl:value-of select="$pCurrent/@*[name() = local-name(current())]"/>
</xsl:template>
<xsl:template match="gen-attr:setting">
<xsl:param name="pCurrent"/>
<xsl:variable name="vnextCurrent" select=
"$pCurrent/@*[name() = local-name(current())]"/>
<xsl:apply-templates select="node()[$vnextCurrent]">
<xsl:with-param name="pCurrent" select="$vnextCurrent"/>
</xsl:apply-templates>
</xsl:template>
<xsl:template match="gen:current">
<xsl:param name="pCurrent"/>
<xsl:value-of select="$pCurrent"/>
</xsl:template>
<xsl:template match="gen:literal">
<xsl:apply-templates/>
</xsl:template>
</xsl:stylesheet>
この変換により、必要な出力の視覚的(骨格)表現を作成し、それを使用してソースXMLドキュメントからの必要なデータを「入力」する方法がわかります。
結果は最初のソリューションの結果と同じです。この変換を「現状のまま」実行すると、多くの名前空間が生成されます。これらは無害であり、レイアウトが別のXMLファイルにある場合は生成されません。