XSLT 命名空间别名在 Firefox 或 Chrome 中不起作用



我正在将 xhtml 转换为 xhtml,但需要一个 xslt 样式表作为结果文档的一部分(样式表将包含在 <script type"text/template"> 元素中。我正在使用xsl:namespace-alias指令,它在IE中工作正常,但在Chrome和Firefox中都失败了。

以下是相关代码:

<xsl:output  doctype-system="about:legacy-compat" omit-xml-declaration="yes" indent="yes" method="html" media-type="application/xhml" encoding="utf-8"/>
<xsl:namespace-alias stylesheet-prefix="wxsl" result-prefix="xsl" />
  <xsl:template match="head">
     <!-- Some code omitted for clarity -->
       <script type="text/template">
        <wxsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns="http://www.w3.org/1999/xhtml"
          xmlns:xhtml="http://www.w3.org/1999/xhtml" xmlns:eli="local">
          <wxsl:template select="/">
            <wxsl:apply-templates />
        </wxsl:template>

      </wxsl:stylesheet>

    </script>
    </xsl:copy>
  </xsl:template>

它在IE中输出所需的转换,但是Firefox和Chrome的XSLT处理器不会将wxsl前缀替换为xsl

Mozilla不支持它,有一个开放的错误报告 https://bugzilla.mozilla.org/show_bug.cgi?id=213996。

至于Chrome,我写了一个简短的测试用例,其中XHTML输入 http://home.arcor.de/martin.honnen/xslt/test2016012402.xml(只是一个简短的XHTML示例,head添加一些XSLT,然后使用XSLT)和样式表 http://home.arcor.de/martin.honnen/xslt/test2016012401.xsl 进行XHTML到XHTML的转换,使用别名来保护任何XSLT和XSLT嵌套的XHTML结果元素:

<?xml version="1.0" encoding="UTF-8" ?>
<xsl:stylesheet
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  version="1.0"
  xmlns:xhtml="http://www.w3.org/1999/xhtml"
  xmlns:axsl="http://example.com/xsl-alias"
  xmlns:axhtml="http://example.com/xhtml-alias"
  exclude-result-prefixes="xhtml axsl axhtml"
  xmlns="http://www.w3.org/1999/xhtml">
<xsl:output method="xml" indent="yes"/>
<xsl:namespace-alias stylesheet-prefix="axsl" result-prefix="xsl"/>
<xsl:namespace-alias stylesheet-prefix="axhtml" result-prefix="#default"/>
<xsl:template match="@* | node()">
  <xsl:copy>
    <xsl:apply-templates select="@* | node()"/>
  </xsl:copy>
</xsl:template>
<xsl:template match="xhtml:head">
  <xsl:copy>
    <xsl:apply-templates select="@* | node()"/>
    <axsl:stylesheet version="1.0">
      <axsl:template match="/">
        <axhtml:p>XSLT created paragraph.</axhtml:p>
      </axsl:template>
    </axsl:stylesheet>
  </xsl:copy>
</xsl:template>
</xsl:stylesheet>

Chrome 似乎可以很好地转换这一点,检查控制台显示结果元素位于正确的命名空间中:

<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
<head>
<title>Test</title>
<axsl:stylesheet xmlns:axsl="http://www.w3.org/1999/XSL/Transform" version="1.0"><axsl:template match="/"><axhtml:p xmlns:axhtml="http://www.w3.org/1999/xhtml">XSLT created paragraph.</axhtml:p></axsl:template></axsl:stylesheet></head>
<body>
<h1>Test</h1>
</body>
</html>

我已经扩展了测试用例以尝试执行嵌入式样式表,Edge和Chrome都能够做到这一点,请参阅 http://home.arcor.de/martin.honnen/xslt/test2016012407.xml,尽管Chrome由于我无法确定的原因在我设置的DOMContentLoaded事件侦听器中无法做到这一点。但这似乎不是与使用 XSLT 插入 XSLT 相关的问题,当我使用按钮运行使用嵌入式样式表执行 XSLT 的脚本时,它在 Chrome 中工作正常。显然,Firefox缺乏对xsl:namespace-alias的支持,永远找不到样式表根元素能够有一些代码馈送到XSLTProcessor

相关内容

  • 没有找到相关文章

最新更新