使用 XSL 在 XML 个文件中打印编码属性

Printing the encoding attribute in XML files with XSL

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

这是输入 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 header 。但是我怎样才能匹配 XML header 中的内容?

<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>

在您使用支持 XML 的处理器阅读 XML 后,XML 序言的编码伪属性不再相关。除非序言中的编码与使用的编码不匹配 and 文件包含无法用该编码表示的字符。

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

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

如果您想知道 documentdocunparsed-text 等函数的编码,这些函数的定义是它们将从序言中读取编码并使用它.在 XSLT 3.0 中,您可以使用 try/catch 来确定它是否成功解析了一个文件。在 XSLT 2.0 中,您有 doc-available,如果编码与使用的字节不匹配,它将 return false。