导入模板的动态输出命名空间



>我有一个简单的XSL,它使用导入:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0" xmlns="http://ex1">
  <xsl:import href="import.xsl" />
  <xsl:template match="/">
    <ROOT>
      <FIRST />
      <xsl:apply-templates />
    </ROOT>
  </xsl:template>
</xsl:stylesheet>

导入的样式表为:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">
    <xsl:template match="elm">
        <ELM/>
    </xsl:template>
</xsl:stylesheet>

现在我希望导入的模板也使用主样式表中定义的默认命名空间http://ex1。我期望:

<ROOT xmlns="http://ex1">
   <FIRST/>
   <ELM/>
</ROOT>

但我得到了:

<ROOT xmlns="http://ex1">
   <FIRST/>
   <ELM xmlns=""/>
</ROOT>

导入的样式表必须输出到主模板定义的命名空间。

我试过什么

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0" xmlns="http://ex1">
  <xsl:import href="import_nsparam.xsl" />
  <xsl:template match="/">
    <ROOT>
      <FIRST />
      <xsl:apply-templates>
        <xsl:with-param name="ns">http://ex1</xsl:with-param>
      </xsl:apply-templates>
    </ROOT>
  </xsl:template>
</xsl:stylesheet>

通过此导入:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">
    <xsl:template match="elm">
        <xsl:param name="ns"/>
        <xsl:element name="ELM" namespace="{$ns}"/>
    </xsl:template>
</xsl:stylesheet>

它可以工作,但它需要大量的生物板代码。

有没有更好的方法可以做到这一点?

您可以尝试<xsl:with-param name="ns" select="namespace-uri-for-prefix('', document('')/*)"/>而不是<xsl:with-param name="ns">http://ex1</xsl:with-param>,这样就不必在样式表中对命名空间进行两次硬编码。

最新更新