ホームページ  >  記事  >  バックエンド開発  >  サーバーサイド XSLT 中に発生するエンコードの問題の解決策

サーバーサイド XSLT 中に発生するエンコードの問題の解決策

Y2J
Y2Jオリジナル
2017-04-22 14:50:191923ブラウズ

最近、Apple Pi を使用した Weather For Google Earth の最適化について議論した際、XML データを変換するために XSLT を使用しました。ここでは、変換エンジンを使用する必要があります。おおよそのプロセスは、XML ファイルと XSLT ファイルの両方をメモリに再印刷し、 DOM エンジンを必要な HTML に変換します (この場合は KML ファイルを生成します)。この変換プロセスはクライアント側とサーバー側に分かれています。クライアント側の変換ではユーザーのブラウザが XML を完全にサポートしている必要がありますが、現在すべてのユーザーのブラウザが XML をサポートしているわけではないため、サーバーは XML をサポートしていません。 -側の変換が行われます。
XML ファイル形式:

<?xml version="1.0" encoding="UTF-8"?> 
<weather ver="2.0"> 
  <head>[...] 
  </head> 
  <loc id="CHXX0101">[...]   
  </loc>   
  <cc>[...]   
  </cc>   
  <dayf>   
    <lsup>10/28/06 11:16 AM Local Time</lsup>   
    <day d="0" t="Saturday" dt="Oct 28">[...]   
    </day>   
    <day d="1" t="Sunday" dt="Oct 29">[...]   
    </day>   
  </dayf>  
</weather>

およびストリーム エンコーディング==========================

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/> 
    <xsl:template match="/">[...] 
</xsl:stylesheet>

//=====Getそしてリモート XML ファイルをロードします=== =======================

Response.ContentType = "application/vnd.google-earth.kml+xml"; 
      Response.CharSet = "UTF-8" ;

//======XSL ファイルをロード=== ========= ==============

 var oXHy = Server.CreateObject("MSXML2.XMLHTTP"); 
      var url  = http://www.dnxh.cn/ge/CHXX0101.xml;   
      oXHy.open("GET",url,false); 
      oXHy.send(); 
      var oXD = Server.CreateObject("MSXML2.DOMDocument"); 
      oXD.loadXML(oXHy.responseText);

//======ファイル変換============= =======

Response.Write(oXD.transformNode(xsl));

エンコーディングはあらゆる場所で宣言されているため、論理的に言えば、エンコーディングの問題は発生しないはずです。しかし、何か問題が発生しました。出力された KML ファイルの開始ステートメントは常に

var xsl = Server.CreateObject("Microsoft.XMLDOM"); 
      xsl.async = false; 
      xsl.load(Server.MapPath("gew.xsl"));

です。テストの結果、XML と XSLT の 2 つのソース ファイルには問題がないことが判明しました。問題は、ASP コード内の変換エンジンにあります。 RE: [xsl] 中国語の問題 (解決策) この記事では、transformNode エンジンが文字列を生成するが、win32 プラットフォームでは文字列の処理に常に UTF-16 が使用されるため、これを使用するという理由を大まかに見つけました。 KML ファイルを生成する文字列の場合、結果は UTF-16 のみになります。
解決策は、transformNodeToObject エンジンを使用することです。ファイル変換部分は oXD.transformNodeToObject(xsl, Response) に置き換えられます。これら 2 つのメソッドの違いは、前者は文字列変数を生成するのに対し、後者は変換された XML データを指定したノードに直接保存することです。

以上がサーバーサイド XSLT 中に発生するエンコードの問題の解決策の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。