最近、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" ;
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);
エンコーディングはあらゆる場所で宣言されているため、論理的に言えば、エンコーディングの問題は発生しないはずです。しかし、何か問題が発生しました。出力された 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 サイトの他の関連記事を参照してください。