1

我有一长串可能有不同编码的 xml 文件。我想浏览所有文件并打印它们的编码。在 XML 标头中打印编码属性只是第一步。(下一步,一旦我知道如何访问 encoding 属性,将使用 encoding 属性来测试这是否是预期的编码。)

这是输入 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 prolog 的编码伪属性不再相关。除非序言中的编码与使用的编码不匹配,并且文件包含无法以该编码表示的字符。

我知道使用 XSLT 获取编码的唯一方法是使用函数unparsed-text(XSLT 2.0) 或unparsed-text-lines(XSLT 3.0),然后使用正则表达式(replacexsl:analyze-string,两者都是 XSLT 2.0)手动解析序言。

由于 XSLT(以及大多数支持 XML 的工具和处理器)不是将 XML 视为文本文件,而是将 XML 视为具有字符流而不是流字节的一组节点,因此几乎不需要读取编码的要求。

如果您想知道document,doc或之类的函数的编码unparsed-text,则定义这些函数以便它们将从序言中读取编码并使用它。在 XSLT 3.0 中,您可以使用try/catch它来确定它是否成功解析文件。在 XSLT 2.0 中doc-available,如果编码与使用的字节不匹配,它将返回 false。

于 2015-09-04T13:57:52.613 回答