xml を xhtml に解析する TransformBinder クラスのインスタンス メソッド

Y2J
リリース: 2017-04-22 14:20:34
オリジナル
1410 人が閲覧しました

ここ数日、私は xml を xhtml に変換するための xslt を勉強していました。前の記事では、xslt を使用して xml を xhtml に解析する方法を紹介しました。

前の方法のため、xslt を xml ファイル内に直接インポートする必要があります。 、プロジェクトで使用される xml ファイルはシステムによって生成され、パスを提供することしかできませんが、xml の内容を書き換える方法はないため、xml と xslt を外部で関連付ける方法を見つける必要があります。これは目的を達成するだけでなく、複数の XML ファイルに適用できるため、管理にも便利です。
コードから始めましょう。システムはパッケージ化にモジュール js を使用します。このツールは今後の記事で紹介する予定ですが、まだ勉強していません。基礎となるコードはまだあります。ここでは、クラスとクラスによって実装されるメソッドを含む js をファイルに記述します。
以下は js コードです。transform.js

コードは次のとおりです。 : XSLTtransform.htm

コードは次のとおりです:

var XmlDom=function(){
 if (window.ActiveXObject) {
  // IE
 var arrSignatures = ["MSXML2.DOMDocument.5.0", "MSXML2.DOMDocument.4.0", "MSXML2.DOMDocument.3.0", "MSXML2.DOMDocument", "Microsoft.XmlDom"];
 for (var i=0; i < arrSignatures.length; i++)
 {
  try { var oXmlDom = new ActiveXObject(arrSignatures[i]); return oXmlDom;
 }
 catch (oError)
  {
 //ignore
 }
 }
 throw new Error("你的系统没有安装 MSXML.");
  }
   else if(document.implementation.createDocument){
 // Firefox
 var oXmlDom = document.implementation.createDocument("", "", null); return oXmlDom;
 }
 else{ throw new Error("浏览器不支持 XML DOM object.");
 }
 }
  var transformXSLT=function(_XML,_XSL)
   {
    if (window.Node)
     {
      Node.prototype.transformNode = function(XslDom)
       {
        var oProcessor = new XSLTProcessor();
         oProcessor.importStylesheet(XslDom);
        var oResultDom = oProcessor.transformToDocument(myXmlDom);
        var oSerializer = new XMLSerializer();
        var sXml = oSerializer.serializeToString(oResultDom, "text/xml");
        return sXml;
        }
       }
   var myXmlDom = new XmlDom();
   myXmlDom.async=false;
   var myXslDom = new XmlDom();
   myXslDom.async=false;
   myXmlDom.load(_XML);
   myXslDom.load(_XSL);
   var sResult=myXmlDom.transformNode(myXslDom);
   if(window.ActiveXObject){
    if(myXmlDom.parseError.errorCode != 0){
     var sError=myXmlDom.parseError;
     var txt = ""; txt += "<br>错误代码: "; txt += sError.errorCode;
     txt += "<br>错误原因: ";
     txt += sError.reason; txt += "<br>错误行号: ";
     txt += sError.line; document.write(txt);
      }else{
       document.write(sResult);
        }
       }else if(document.implementation.createDocument){
        var oSerializer = new XMLSerializer();
        var sXmlDom = oSerializer.serializeToString(myXmlDom, "text/xml");
        var oParser = new DOMParser(); var oXmlDom = oParser.parseFromString(sXmlDom,"text/xml");
        if (oXmlDom.documentElement.tagName == "parsererror")
         { var oXmlSerializer = new XMLSerializer();
          var sXmlError = oXmlSerializer.serializeToString(oXmlDom); alert(sXmlError);
           } else { document.write(sResult);
            }
           }
          } var TransformBinder = function(XML,XSL) { this.XML = XML; this.XSL = XSL; } TransformBinder.prototype.registerAction = function(handlers) { this.handlers = handlers; } TransformBinder.prototype.bind = function() { var _this = this; this.handlers(_this.XML,_this.XSL); }
ログイン後にコピー

transform.js を分析します:

xmlDom IE と FF の場合、dom を作成するメソッドである xml の dom 要素を作成するためにコンストラクターが使用されます。 IE は window.ActiveXObject メソッドを使用して作成し、FF は document.implementation.createDocument メソッドを使用して作成します。IE か FF かを判断します。
IE で異なるバージョンの xml ["MSXML2.DOMDocument.5.0"、"MSXML2.DOMDocument.4.0"、"MSXML2.DOMDocument.3.0"、"MSXML2.DOMDocument"、"Microsoft.XmlDom"]) の場合は、for ループを使用します対応するバージョンを検索して、 new ActiveXObject(arrSignatures[i]); で dom を作成します。 ブラウザーが dom を直接作成するには、document.implementation.createDocument("", "", null); を使用します。 XML DOM オブジェクトをサポートするとエラーがスローされます。 transformXSLT コンストラクターは、XSLT を使用して XML を HTML に変換します。FF には、transformNode メソッドがないため、独自にメソッドを構築しました。コードは次のとおりです。

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> 
<html> 
<head> 
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 
<script type=&#39;text/javascript&#39; src="transform.js"></script> 
</head> 
<body> 
<script type="text/javascript"> 
var XML = "这里输入XML路径"; 
var XSL = "这里输入XSL路径"; 
var tempObj = new TransformBinder(XML,XSL); 
tempObj.registerAction(transformXSLT); 
tempObj.bind(); 
</script> 
</body> 
</html>
ログイン後にコピー

次に、このメソッドを使用して、IE と変換を実装します。 IE のエラー処理 FF には比較的単純なエラー情報をロードするための parseError 属性があります。ここでは、errorCode はエラーの理由、line はエラーの行番号です。メインエラーが表示されます。エラーがあればエラー内容が表示されます。エラーがなければ変換結果 sResult が表示されます。 FF では、XMLSerializer と XMLSerializer.serializeToString() を使用して xmlDom を文字列に変換し、その文字列を dom オブジェクトに変換することで、変換プロセス中にエラーが報告された場合、parsererror を含む情報を取得できます。文字列のtagNameがパーサーエラーかどうかを判断し、そうでない場合はその文字列の内容をスローします。
ここで注意すべき点がいくつかあります:
a. IE は XML 内の DTD エラーを検出できますが、FF は XML 自体の文法エラーのみを検出できます。
b. エラーはブラウザーで判断する必要があるため、最終的な結果は検出されません。コード構造の観点からはマージは合理的ではないように見えますが、これも無力な手段です。

簡単に拡張および変更できるように、TransformBinder クラスを使用してカプセル化します。

TransformBinder.prototype.registerAction このプロトタイプはイベントを登録するために使用され、次に TransformBinder.prototype.bind を使用してイベントをバインドする必要がある場合は、新しい TransformBinder (XML、XSL) を作成し、transformXSLT イベントを登録するだけです。 、バインドするとこの効果が得られます。拡張する必要がある場合は、新しいコンストラクターを作成し、登録してこのクラスにバインドして効果を実現します。

以上がxml を xhtml に解析する TransformBinder クラスのインスタンス メソッドの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!