使用stackoverflow一年后,我决定加入,但当然是因为经过一天的挣扎之后,我被卡住了。
我的问题:我使用javascript来构建由xml文档和样式表组成的文档。这样做很好,(在Firefox中,在IE中根本没有)我的两个案例,但不是第三个。
的javascript ========================================
function GetBookInfo(object)
{
try
{
var xmlCont=loadXMLDoc("files/books/"+object.id+"/META-INF/container.xml");
opfFile=xmlCont.getElementsByTagName("container")[0].getElementsByTagName("rootfiles")[0].getElementsByTagName("rootfile")[0].getAttribute("full-path");
xmlCont=loadXMLDoc("files/books/"+object.id+"/"+opfFile);
xsl=loadXMLDoc("files/content.xsl");
displayXML(xmlCont, xsl, object.id);
}
catch (EventException)
{
alert(EventException.toString());
}
}
function displayXML(xmlIn, xslIn, place)
{
// code for IE
if (window.ActiveXObject)
{
ex=xmlIn.transformNode(xslIn);
document.getElementById(place).innerHTML=ex;
}
// code for Mozilla, Firefox, Opera, etc.
else
if (document.implementation && document.implementation.createDocument)
{
xsltProcessor=new XSLTProcessor();
xsltProcessor.importStylesheet(xslIn);
resultDocument = xsltProcessor.transformToFragment(xmlIn,document);
document.getElementById(place).appendChild(resultDocument);
}
}
function loadXMLDoc(dname)
{
if (window.ActiveXObject)
{
xhttp=new ActiveXObject("Microsoft.XMLHTTP");
}
else
{
if (window.XMLHttpRequest)
{
xhttp=new XMLHttpRequest();
}
}
try
{
xhttp.open("GET",dname,false);
xhttp.send("");
return xhttp.responseXML;
}
catch (EventException)
{
alert("Could not open: " +dname);
}
}
的javascript ======================================== XSL ==============================================
<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/package">
<html>
<head>
</head>
<body>
<div id="METADATA">
<p>Hello</p>
<div id="title">
<xsl:value-of select='metadata/dc:title'/>
</div>
<br />
<div id="creator">
<xsl:value-of select='metadata/dc:creator'/>
</div>
<br />
<div id="publisher">
<xsl:value-of select='metadata/dc:publisher'/>
</div>
<br />
<div id="language">
<xsl:value-of select='metadata/dc:language'/>
</div>
<br />
<div id="rights">
<xsl:value-of select='metadata/dc:rights'/>
</div>
<br />
<div id="subject">
<xsl:value-of select='metadata/dc:subject'/>
</div>
<br />
<div id="publicationDate">
<xsl:value-of select='metadata/dc:date[@opf:event="publication"]'/>
</div>
<br />
<div id="conversionDate">
<xsl:value-of select='metadata/dc:date[@opf:event="conversion"]'/>
</div>
<br />
<div id="source">
<xsl:value-of select='metadata/dc:source'/>
</div>
<br />
</div>
</body>
</html>
</xsl:template>
</xsl:stylesheet>
XSL ==============================================
xml文件是epub文件夹中的典型opf文件。 opf(标准xml)============================================= =====
<?xml version='1.0' encoding='UTF-8'?>
<package xmlns:opf="http://www.idpf.org/2007/opf" xmlns:dcterms="http://purl.org/dc/terms/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.idpf.org/2007/opf" version="2.0" unique-identifier="id">
<metadata>
<dc:rights>Public domain in the USA.</dc:rights>
<dc:identifier id="id" opf:scheme="URI">http://www.gutenberg.org/ebooks/1065</dc:identifier>
<dc:creator opf:file-as="Poe, Edgar Allan">Edgar Allan Poe</dc:creator>
<dc:title>The Raven</dc:title>
<dc:language xsi:type="dcterms:RFC4646">en</dc:language>
<dc:subject>Poetry, English</dc:subject>
<dc:date opf:event="publication">1997-10-01</dc:date>
<dc:date opf:event="conversion">2010-06-08T08:59:43.376234+00:00</dc:date>
<dc:source>http://www.gutenberg.org/files/1065/1065-h/1065-h.htm</dc:source>
<meta content="item5" name="cover"/>
</metadata>
<manifest>
<item href="pgepub.css" id="item1" media-type="text/css"/>
<item href="0.css" id="item2" media-type="text/css"/>
<item href="1.css" id="item3" media-type="text/css"/>
<!--Chunk: size=31062-->
<item href="www.gutenberg.org@files@1065@1065-h@1065-h-0.htm" id="item4" media-type="application/xhtml+xml"/>
<item href="cover.jpg" id="item5" media-type="image/jpeg"/>
<item href="toc.ncx" id="ncx" media-type="application/x-dtbncx+xml"/>
</manifest>
<spine toc="ncx">
<itemref idref="item4" linear="yes"/>
</spine>
</package>
opf(标准xml)========================================== ======
非常感谢任何帮助。 PS:如果有人知道为什么IE不会显示任何xsl创建的文档有错误: “样式表不包含文档元素。样式表可能是空的,或者它可能不是格式良好的XML文档。” 它也会有所帮助,谢谢。
答案 0 :(得分:2)
您的样式表失败,因为它无效。它在几个地方使用dc:
和opf:
命名空间,但不声明它们。要解决此问题,请更改开始xsl:stylesheet
标记以包含必要的命名空间声明。由于源XML使用默认命名空间,因此您还需要为这些节点使用命名空间。我还修改了你的XSLT,以展示它如何变得更简洁:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:opf="http://www.idpf.org/2007/opf">
<xsl:template match="opf:package">
<html>
<head>
</head>
<body>
<xsl:apply-templates select="opf:metadata" />
</body>
</html>
</xsl:template>
<xsl:template match="opf:metadata">
<div id="METADATA">
<p>Hello</p>
<xsl:apply-templates select='dc:title'/>
<xsl:apply-templates select='dc:creator'/>
<xsl:apply-templates select='dc:publisher'/>
<xsl:apply-templates select='dc:language'/>
<xsl:apply-templates select='dc:rights'/>
<xsl:apply-templates select='dc:subject'/>
<xsl:apply-templates select='dc:date[@opf:event="publication"]'>
<xsl:with-param name='id' select='"publicationDate"' />
</xsl:apply-templates>
<xsl:apply-templates select='dc:date[@opf:event="conversion"]'>
<xsl:with-param name='id' select='"conversionDate"' />
</xsl:apply-templates>
<xsl:apply-templates select='dc:source'/>
</div>
</xsl:template>
<xsl:template match='opf:metadata/*'>
<xsl:param name='id' select='local-name()' />
<div id='{$id}'>
<xsl:value-of select='.'/>
</div>
<br />
</xsl:template>
</xsl:stylesheet>
答案 1 :(得分:0)
在XSLT代码中编写路径表达式时,需要考虑包括默认命名空间的命名空间。
所以你的代码应该是
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:opf="http://www.idpf.org/2007/opf"
xmlns:dc="http://purl.org/dc/elements/1.1/"
exclude-result-prefixes="opf dc">
<xsl:output method="html" indent="yes"/>
<xsl:template match="/opf:package">
<div id="METADATA">
<p>Hello</p>
<div id="title">
<xsl:value-of select='opf:metadata/dc:title'/>
</div>
<br />
<div id="creator">
<xsl:value-of select='opf:metadata/dc:creator'/>
</div>
<br />
<div id="publisher">
<xsl:value-of select='opf:metadata/dc:publisher'/>
</div>
<br />
<div id="language">
<xsl:value-of select='opf:metadata/dc:language'/>
</div>
<br />
<div id="rights">
<xsl:value-of select='opf:metadata/dc:rights'/>
</div>
<br />
<div id="subject">
<xsl:value-of select='opf:metadata/dc:subject'/>
</div>
<br />
<div id="publicationDate">
<xsl:value-of select='opf:metadata/dc:date[@opf:event="publication"]'/>
</div>
<br />
<div id="conversionDate">
<xsl:value-of select='opf:metadata/dc:date[@opf:event="conversion"]'/>
</div>
<br />
<div id="source">
<xsl:value-of select='opf:metadata/dc:source'/>
</div>
<br />
</div>
</xsl:template>
</xsl:stylesheet>
我已删除了html
和body
元素,因为您的Javascript代码表示您要创建一个HTML片段,以包含在已包含这些结构元素的现有HTML文档中。