2

XML のセットを処理する XSLT を作成しました。
XSLT は正常に処理されていますが、これらの XML のエンコード セットが異なります。現在、次のように出力タグを使用しています。

<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>

しかし、これはエンコーディングを に強制的に変更しますがUTF-8、実際の XML ドキュメントに存在するのと同じ値が必要です。
どうすればこれを入手できますか?

4

1 に答える 1

2

しかし、これはエンコードを UTF-8 に強制的に変更しますが、実際の XML 文書に存在するのと同じ値が必要です。

XML の観点からは、適切な文字がエスケープされている限り (XSLT プロセッサによってエスケープされる)、使用されるエンコーディングに違いはありません。すべての XML プロセッサは、UTF-8、UTF-16、および US-ASCII をサポートする必要があります。後者は、たとえば、XML を古い技術を使用して転送する必要がある場合に使用できます。そうしないと、UTF エンコーディングが混乱する可能性があります (たとえば、いくつかの古い FTP システム)。

とはいえ、XSLT 2.0 と 3.0 では、単純に を使用してこれを動的に行う方法とxsl:result-document、XML を解析されていないテキストとしてロードするというトリックがあります。

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:f="http://example.com/functions">

    <xsl:template match="/">
        <xsl:result-document href="output-filename" encoding="{f:get-encoding(.)}">
            <!-- your code -->
        </xsl:result-document>
    </xsl:template>

    <xsl:function name="f:get-encoding">
        <xsl:param name="node" />
        <xsl:variable name="regex">^.*encoding=['"]([a-zA-Z0-9-]+)["'].*$</xsl:variable>
        <xsl:value-of select="replace(tokenize(unparsed-text($node/base-uri()), '\n')[1], $regex, '$1')"/>        
    </xsl:function>

 </xsl:stylesheet>

またはxsl:output、XSLT 3.0 を使用して

要するに、XSLT、XPath、および XDM のかなりの数の新しい概念を示すわずか数行のコードです。

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="3.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

    <xsl:param name="input-url" static="yes" select="'yourinput.xml'" />

    <xsl:variable name="get-encoding" static="yes" select='
        let $regex := "^.*encoding=[&apos;""]([a-zA-Z0-9-]+)[&apos;""].*$"
        return function($n) {
            replace(tokenize(unparsed-text($n), "\n")[1], $regex, "$1")
        }' />

    <!-- a shadow attribute is replaced with the actual attribute by the same name -->
    <xsl:output _encoding="{$get-encoding($input-url)}" />

    <xsl:template match="/">
        <!-- your code here -->
        <result />
    </xsl:template>

</xsl:stylesheet>

このコードはExseltで正しく実行されますが、私のバージョンのSaxonは (まだ) サポートしていません (unparsed-text静的な式での使用は許可されていません)。構成可能。他の XSLT プロセッサはテストしていません。

于 2015-08-17T15:30:47.023 に答える