从XSL创建XSL。

4

我正在尝试从一个XSLT样式表动态生成XSLT文档。理论上,这当然是可行的,但我无法让命名空间正常工作。我希望生成的XSLT元素能够使用“xsl”前缀:

<xsl:stylesheet ...>

相比之下
<stylesheet xmlns="http://www.w3.org/1999/XSL/Transform">

我尝试使用xsl:element的namespace=""以及xsl:namespace,但无法使其生效(xslt2/saxon可用)。
有什么提示吗?
3个回答

4
如果你想使用XSLT来创建XSLT代码,那么使用http://www.w3.org/TR/xslt20/#element-namespace-alias可以帮助你。
<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>

嗨,谢谢,这就是解决方案!但是我发现,也可以直接使用“xsd”本身(请参见我的解决方案)。这样做有什么问题吗? - divB
1
在您的评论中,您说要使用“xsd”本身,我想您指的是xsl而不是xsd。至于您发布的<xsl:element name="xsl:stylesheet">,如果您想使用那种方式,可以这样做,但只要我不需要动态计算节点名称,我就更喜欢编写文字结果元素和属性,这样使用命名空间别名允许我继续编写文字结果元素和属性,而不是更繁琐和冗长的xsl:element和/或xsl:attribute。因此,为了简洁和优雅起见,我强烈建议使用命名空间别名。 - Martin Honnen

2
我找到了解决方案:
<xsl:element name="xsl:stylesheet">
</xsl:element>

做到了!(即避免使用namespace = "",而是明确列出命名空间前缀)


1
如果你真的想学习一些东西——这也是 SO 的主要目的——那么请遵循更简单和标准的 XSLT 生成样式表的方式,正如我和 Martin Honnen 在回答中所推荐的那样。 - Dimitre Novatchev
对于不支持xsl:namespace-alias的XSLT处理器(例如Transformiix),有一个很好的解决方法。 - Paul Sweatte

1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接