使用XSL在XML文件中打印encoding属性

时间:2015-09-04 13:52:34

标签: xslt encoding attributes xml-declaration

我有一长串xml文件,这些文件可能有不同的编码。我想浏览所有文件并打印他们的编码。在XML标头中打印编码属性只是第一步。 (下一步,一旦我发现如何访问编码属性,将使用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>

1 个答案:

答案 0 :(得分:3)

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

我知道使用XSLT获取编码的唯一方法是使用函数unparsed-text(XSLT 2.0)或unparsed-text-lines(XSLT 3.0),然后使用正则表达式({{1}或者replace,两个XSLT 2.0)手工解析序言。

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

如果您想知道xsl:analyze-stringdocumentdoc等函数的编码,则会定义这些函数,以便它们从prolog中读取编码并使用它。在XSLT 3.0中,您可以使用unparsed-text来确定它是否成功解析文件。在XSLT 2.0中,您有try/catch,如果编码与使用的字节不匹配,则返回false。

相关问题