2015-09-04 70 views
1

我有一長串xml文件,它們可能有不同的編碼。我想瀏覽所有文件並打印它們的編碼。在XML標題中打印編碼屬性只是第一步。 (下一步,一旦我瞭解如何獲得訪問編碼屬性將要使用的編碼屬性來測試,如果是這樣的預期編碼。)用XSL打印XML文件中的編碼屬性

這是怎麼輸入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> 

回答

3

在使用支持XML的處理器讀取XML後,XML prolog的編碼僞屬性不再相關。除非序言中的編碼與使用的編碼不匹配,否則該文件包含無法用該編碼表示的字符。

我知道的唯一的方式來使用XSLT來獲得的編碼是使用功能unparsed-text(XSLT 2.0)或unparsed-text-lines(XSLT 3.0),然後使用正則表達式(replacexsl:analyze-string,無論是XSLT 2.0)來解析prolog手工。由於XSLT(以及大多數支持XML的工具和處理器)不是將XML看作文本文件,而是將XML看作一組具有字符流的節點,而不是字節流,因此讀取編碼的要求幾乎不再需要。

如果您想知道document,docunparsed-text等函數的編碼,那麼這些函數被定義爲它們將從prolog中讀取編碼並使用它。在XSLT 3.0中,您可以使用try/catch來確定它是否成功解析文件。在XSLT 2.0中,您有doc-available,如果編碼與使用的字節不匹配,則將返回false。

+0

哦,我明白了...我懷疑XML prolog在某種程度上是特殊的。如果使用多種語言的文件,我正在使用文檔函數來處理長列表。列表中大多數文件的「正常」編碼應該是「iso-8859-1」,但是有時例如波蘭文或羅馬尼亞文件也可以得到這種編碼。然後這個文件需要額外檢查,因爲在這個過程中可能會損壞一些字符。因此,對於這些文件,最好儘可能使用UTF-8。 – Gunilla

+0

@Gunilla:你的意思是說這些文件被編碼爲UTF-8,但是有一個不同的編碼序言?你可以做的最好的是預處理你的文件列表,並簡單地刪除序言(只是刪除第一行),如果序言不存在,作爲默認編碼是UTF-8或UTF-16(區別在於可以從BOM中自動確定)。 – Abel

+0

好主意!如果所有文件默認編碼爲UTF-8(如果prolog不存在),則不會破壞字符。對於那些我知道的文件/語言將轉到需要iso-8859-1編碼的目標系統,可以使用transform 。我認爲這將簡化這些文件的維護並降低錯誤風險。非常感謝你! – Gunilla