2014-10-10 63 views
0

我在libxmljs存儲庫上發佈了一個問題,並且它已關閉,因爲他們認爲這在lib的級別上不是問題。所以我把它張貼在這裏。使用libxmljs和nodejs無效的XSD架構

我想用OASIS提供的XML架構來驗證XLIFF文件,但我一直收到XSD的錯誤。

Error: Invalid XSD schema at Document.validate (/Users/fluxb0x/Tests/xliff_parser/node_modules/libxmljs/lib/document.js:73:17) at Request._callback (/Users/fluxb0x/Tests/xliff_parser/main.js:25:21) at Request.self.callback (/Users/fluxb0x/Tests/xliff_parser/node_modules/request/request.js:199:22) at Request.emit (events.js:98:17) at Request. (/Users/fluxb0x/Tests/xliff_parser/node_modules/request/request.js:1160:14) at Request.emit (events.js:117:20) at IncomingMessage. (/Users/fluxb0x/Tests/xliff_parser/node_modules/request/request.js:1111:12) at IncomingMessage.emit (events.js:117:20) at _stream_readable.js:938:16 at process._tickCallback (node.js:419:13)

我已經使用Oxygen XML編輯器來測試驗證,它沒有問題。

這是我導出的XLIFF文件:en.xliff

這是由OASIS提供的XSD文件:xliff_schema.xsd

相當大的文件。

謝謝你的幫助。

回答

0

正如您在libxmljs bug tracker中指出的那樣,libxmljs在使用導入另一個模式文件的模式文件驗證XML時會引發錯誤。

<xsd:import namespace="http://www.w3.org/XML/1998/namespace" schemaLocation="./xml.xsd"/> 

這是因爲是在進程當前工作目錄算出的schemaLocation的相對路徑。一個解決方法被確認之前,改變的目錄:

fs.readFile(schemaPath, { encoding: 'utf8' }, function (err, xsd) { 
    if (err) cb (err); 

    var cwd = process.cwd(); 
    process.chdir(path.dirname(schemaPath)); 

    var xsdDoc = libxml.parseXml(xsd); 
    var xmlDoc = libxml.parseXml(content); 

    var output = xmlDoc.validate(xsdDoc); 
    process.chdir(cwd); 

    cb(undefined, xmlDoc.validationErrors); 
}); 

我不知道如何處理libxml這雖然:也許引用的文件同步加載,我想這是不理想的。

這種解決方法僅適用於本地文件,我不知道如何在一個偏遠的schemaLocation一樣的情況下解決您的示例(schemaLocation="http://www.w3.org/2001/xml.xsd"/>

即使它不是一個真正的解決方案,我認爲這可能幫助。

0

如果XSD架構包含xsd:import元件與文件系統相對schemaLocation屬性,則libxmljs.parseXml()函數接受可用於設置的這些位置的一個baseUrl選項。

const xsdDocument = libxmljs.parseXml(xsdString, { baseUrl: "/path/to/xsd/" }); 

這樣可以避免臨時更改工作目錄的需要。留意最後的斜線。