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

时间:2016-01-18 11:05:43

标签: xslt xslt-2.0 xml-namespaces

我有一个使用导入的简单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>

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

有更好的方法吗?

1 个答案:

答案 0 :(得分:1)

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