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

时间:2016-01-24 01:21:50

标签: xslt cross-browser xslt-1.0 xml-namespaces

我正在将xhtml转换为xhtml,但是需要xslt样式表作为结果文档的一部分(样式表将包含在<!DOCTYPE html> <html> <head> <style> img { position: absolute; } div { position: absolute; width: 500px; height: 500px; } #leftside { float: left; } #rightside { float: right; left: 500px; border-left: 1px solid black } </style> <script> function generateFaces() { var img = document.createElement('img'); var position = Math.floor(Math.random() * 500); img.src = 'http://home.cse.ust.hk/~rossiter/mooc/matching_game/smile.png'; img.id = 'smileImage'; img.setAttribute('height', position); img.setAttribute('width', position); document.getElementById('leftSide').appendChild(img); } window.onload = generateFaces; </script> </head> <body> <h1>Matching Game</h1> <p>Click on the extra smiling face on the left.</p> <div id="leftSide"></div> <div id="rightSide"></div> </body> </html>元素中。我使用的是<script type"text/template">指令,在IE中工作正常,但Chrome和Firefox都失败了。

以下是相关代码:

xsl:namespace-alias

它在IE中输出所需的转换,但Firefox和Chrome的XSLT处理器并未将<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> 前缀替换为wxsl

1 个答案:

答案 0 :(得分:3)

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)和样式表{{3执行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/test2016012401.xsl,尽管Chrome由于我无法识别的原因无法在我设置的DOMContentLoaded事件监听器。但这似乎不是一个与使用XSLT插入XSLT相关的问题,当我使用按钮运行脚本执行带有嵌入式样式表的XSLT时,它在Chrome中运行良好。很明显,由于缺乏对xsl:namespace-alias的支持,Firefox从未找到样式表根元素,以便能够将一些代码提供给XSLTProcessor