我有一长串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>
答案 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-string
,document
或doc
等函数的编码,则会定义这些函数,以便它们从prolog中读取编码并使用它。在XSLT 3.0中,您可以使用unparsed-text
来确定它是否成功解析文件。在XSLT 2.0中,您有try/catch
,如果编码与使用的字节不匹配,则返回false。