しかし、これはエンコードを 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=['""]([a-zA-Z0-9-]+)['""].*$"
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 プロセッサはテストしていません。