1

1年間スタックオーバーフローを使用した後、私は参加することに決めましたが、もちろん、苦労して一日を過ごした後、立ち往生しているという事実のためです.

私の問題: javascript を使用して、xml ドキュメントとスタイルシートで作成されたドキュメントを作成しています。これは、2 つのケースではうまく機能しますが (Firefox では、IE ではまったく機能しません)、3 つ目のケースではうまくいきません。

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 ドキュメントではない可能性があります。」それも役に立ちます、ありがとう。

4

2 に答える 2

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>
于 2013-03-29T19:24:47.090 に答える
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>

あなたの Javascript コードは、HTML のフラグメントを作成して、それらの構造要素を既に含む既存の HTML ドキュメントに含めることを示しているため、要素htmlと要素を削除しました。body

于 2013-03-30T10:14:51.517 に答える