1

さまざまなエンコーディングを持つ可能性のある xml ファイルの長いリストがあります。すべてのファイルを調べて、それらのエンコーディングを出力したいと思います。XML ヘッダーのエンコーディング属性の出力は、最初のステップにすぎません。(エンコーディング属性にアクセスする方法がわかったら、次のステップは、エンコーディング属性を使用して、これが予想されるエンコーディングかどうかをテストすることです。)

入力 xml ファイルは次のようになります。

<?xml version="1.0" encoding="iso-8859-1"?>
<Resource Name="text1" Language="de">
    <Text>
    </Text>
</Resource>


<?xml version="1.0" encoding="utf-8"?>
<Resource Name="file2" Language="ko">
    <Text>
    </Text>
</Resource>

最小限に削減されましたが、まだ成功していないxsl。このように書くことで、XMLヘッダーのマッチングに失敗したと思います。しかし、XML ヘッダー内の何かを一致させるにはどうすればよいでしょうか?

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="html"/>

    <xsl:template match="/">
     <html>
        <body>   
            <xsl:value-of select="@encoding"/>
        </body>
     </html>
    </xsl:template>
</xsl:stylesheet>
4

1 に答える 1

3

XML プロローグのエンコーディング疑似属性は、XML 対応プロセッサで XML を読み取った後は関係なくなります。プロローグのエンコーディングが使用されているエンコーディングと一致せず、そのエンコーディングでは表現できない文字がファイルに含まれている場合を除きます。

XSLT を使用してエンコーディングを取得する唯一の方法は、関数unparsed-text(XSLT 2.0) またはunparsed-text-lines(XSLT 3.0) を使用してから、正規表現 (replaceまたはxsl:analyze-string両方の XSLT 2.0) を使用してプロローグを手動で解析することです。

XSLT (およびほとんどの XML 対応ツールとプロセッサ) は、XML をテキスト ファイルとしてではなく、ストリーム バイトではなく、文字のストリームを持つノードのセットとして認識するため、エンコーディングを読み取る必要はほとんどありません。

documentdocまたはのような関数のエンコーディングを知りたい場合unparsed-text、これらの関数は、プロローグからエンコーディングを読み取って使用するように定義されています。XSLT 3.0 ではtry/catch、ファイルの解析に成功したかどうかを調べるために使用できます。XSLT 2.0 ではdoc-available、エンコーディングが使用されるバイトと一致しない場合に false を返します。

于 2015-09-04T13:57:52.613 に答える