我。这种转变:
<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 分钟。
二。布局(视觉)解决方案:
<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 文件中,则不会产生。