我正在将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
。
答案 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
。