2

現在、複数の xml ファイルを xsl ファイルに取り込んで、それらを有用な html に処理しようとしています。これは、非 Webkit ブラウザーでは正常に機能しますが、Webkit ブラウザーでは機能しません。

JavaScript を使用して変換を実行していますが、複数の xml ファイルが必要な場合を除いて、すべてのブラウザーで問題なく動作します。

追加のxmlファイルをxslに入れるためにさまざまな方法を試しましたが、ファイルはすべて同じサーバーにありますが、異なるフォルダーにあります。

1) xml ファイルを変数として直接追加しようとしました。例えば:

<xsl:variable name="structure" select="document('../structure.xml')"/> 

それ以来、セキュリティ上のリスクと見なされているため、Webkit ブラウザーではこれが許可されていないことがわかりました。しかし、誰かが同じ結果を達成するための回避策や別の方法を知っていれば、それは素晴らしいことです

2) xml ファイルをパラメーターとしてプロセッサーに渡そうとしました。例えば:

xml=loadXMLDoc("structure.xml);
xsl=loadXMLDoc("xsl/head.xsl");
structurexml =loadXMLDoc("/extranet/structure.xml");
xsltProcessor =new XSLTProcessor();
xsltProcessor.importStylesheet(xsl);
xsltProcessor.setParameter(null, "structure", structurexml);
process.transform();

loadXMLDoc は、xml ファイルと xsl ファイルをロードする単純なコードです。

function loadXMLDoc(fname) {
var isIE = (navigator.appName=="Microsoft Internet Explorer");
if (window.XMLHttpRequest) {
    xhttp = new XMLHttpRequest();
}
else {
  xhttp = new ActiveXObject('Microsoft.XMLHTTP');
}
xhttp.open('GET', fname, false);
if (xhttp.overrideMimeType){
  xhttp.overrideMimeType('text/xml');   
}
xhttp.send(null);
if (isIE) {
  xmlDoc = new ActiveXObject('Microsoft.XMLDOM');
  xmlDoc.async = false;
  xmlDoc.load(fname);
}
else {
  xmlDoc = xhttp.responseXML;
  if (!xmlDoc) {
    xmlDoc = (new DOMParser()).parseFromString(xhttp.responseText, 'text/xml');
  }
}
return xmlDoc;
}

webkit は node-set をパラメーターとして許可していないため、これは機能しません。繰り返しますが、あらゆる種類の回避策は素晴らしいでしょう

3)上記を試しましたが、パラメーターとして追加する前にxmlを文字列に変換しました。これにより、パラメーターを渡すことができますが、文字列を xml に変換して処理することはできません。

誰かがこれについて何かアイデアを持っていれば、それも素晴らしいでしょう.

私が考えたもう 1 つのオプションは、JavaScript を使用して xml ファイルを 1 つの巨大なファイルにマージし、これを処理することですが、その方法がわかりません。

また、サーバーを制御できないため、サーバー側の処理を実行できないため、クライアント側のみが残されます。

前に言ったように、Webkit 以外のブラウザーの問題を解決できます。しばらくの間、この問題を解決しようとしてきましたが、回避策が見つかりません。この問題を抱えているのは私だけだとは思えません。誰かが同様の問題を抱えていて、これに対する回避策または修正を見つけたことを本当に願っています.

前もって感謝します!

マット


アップデート:

JavaScript で xml ファイルを一緒に追加することも考えました。

xml=loadXMLDoc("structure.xml);
xsl=loadXMLDoc("xsl/head.xsl");
structurexml =loadXMLDoc("/extranet/structure.xml");
newxml = xml;
newxml.appendChild(sessionxml);

しかし、Uncaught Error: HIERARCHY_REQUEST_ERR: DOM Exception 3 というエラーが発生します。これは、新しい xml にルート ノードがないことが原因であると考えられます。それらを正常に追加する方法を知っている人はいますか? 2つのファイルは

<?xml version="1.0" encoding="utf-8"?>
<structure>
  <product>
    <id>1</id>
    <unit>
        <id>1</id>
        <name>Blah</name>
        <code>Blah</code>
    </unit>
  </product>
</structure>

<?xml version="1.0" encoding="utf-8"?>
<user>
  <emp>true</emp>
  <first>Test</first>
  <last>User</last>
</user>

理想的には、ファイルを次の形式にしたい

<?xml version="1.0" encoding="utf-8"?>
<root>
  <structure>
    <product>
      <id>1</id>
      <unit>
          <id>1</id>
          <name>Blah</name>
          <code>Blah</code>
      </unit>
    </product>
  </structure>
  <user>
    <emp>true</emp>
    <first>Test</first>
    <last>User</last>
  </user>
</root>

JavaScript または JQuery でこれを実現する簡単な方法はありますか?

4

1 に答える 1

0

Saxon-CEは XSLT 2.0 プロセッサ (JavaScript にコンパイル) であり、webkit およびすべての主要なブラウザーで実行され、(当然のことながら) document() 関数をサポートします。アトミック値だけでなく、ドキュメント、ノード、配列、さらには JavaScript オブジェクトをパラメーターとして渡すこともサポートしています。

独自のコードと非常によく似たコードを使用して変換を実行できますが、次を使用します。

 xsltProcessor = Saxon.createXSLT20Processor();

ただし、次の JavaScript も使用できます

Saxon.run({
   stylesheet: "xsl/head.xsl",
   source:     "structure.xml",
   parameters: {
                    structure: Saxon.requestXML("/extranet/structure.xml");
               }

});

「構造」パラメーターは説明目的のためだけのものです。あなたの場合は、XSLT 内で通常どおり document() 関数を使用する必要があります。

また、Saxon-CE では、標準の XSLT 2.0 の xsl:result-document 命令を使用して HTML ドキュメントを更新できることにも言及しておく必要があります。したがって、パラグラフを追加して 'head' の ID を持つ DIV 要素を更新する場合は、次のように使用できます。

<xsl:result-document href="#head" method="append-content">
   <p>Book Title: <xsl:value-of select="$title"/></p>
</xsl:result-document>
于 2012-06-21T07:26:22.087 に答える