我正在尝试从一个XSLT样式表动态生成XSLT文档。理论上,这当然是可行的,但我无法让命名空间正常工作。我希望生成的XSLT元素能够使用“xsl”前缀:
<xsl:stylesheet ...>
相比之下
<stylesheet xmlns="http://www.w3.org/1999/XSL/Transform">
我尝试使用xsl:element的namespace=""以及xsl:namespace,但无法使其生效(xslt2/saxon可用)。
有什么提示吗?
<xsl:stylesheet
version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:fo="http://www.w3.org/1999/XSL/Format"
xmlns:axsl="file://namespace.alias">
<xsl:namespace-alias stylesheet-prefix="axsl" result-prefix="xsl"/>
<xsl:template match="/">
<axsl:stylesheet version="2.0">
<xsl:apply-templates/>
</axsl:stylesheet>
</xsl:template>
<xsl:template match="elements">
<axsl:template match="/">
<axsl:comment select="system-property('xsl:version')"/>
<axsl:apply-templates/>
</axsl:template>
</xsl:template>
<xsl:template match="block">
<axsl:template match="{.}">
<fo:block><axsl:apply-templates/></fo:block>
</axsl:template>
</xsl:template>
</xsl:stylesheet>
<xsl:element name="xsl:stylesheet">
</xsl:element>
做到了!(即避免使用namespace = "",而是明确列出命名空间前缀)
xsl:namespace-alias
指令是专门为此用例而设计的--只需在您的工作中开始使用它。
以下是一个真实世界的例子:
http://dnovatchev.wordpress.com/2006/10/21/a-stylesheet-to-write-xslt-code/
xsl
而不是xsd
。至于您发布的<xsl:element name="xsl:stylesheet">
,如果您想使用那种方式,可以这样做,但只要我不需要动态计算节点名称,我就更喜欢编写文字结果元素和属性,这样使用命名空间别名允许我继续编写文字结果元素和属性,而不是更繁琐和冗长的xsl:element
和/或xsl:attribute
。因此,为了简洁和优雅起见,我强烈建议使用命名空间别名。 - Martin Honnen