我有以下 XML 檔案:
<?xml version="1.0" encoding="UTF-8"?>
<root xsi:noNamespaceSchemaLocation="example.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<a>0.1</a>
<b>0.2</b>
</root>
它與以下 XSD 相關聯:
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="root">
<xs:complexType>
<xs:sequence>
<xs:element name="a" type="xs:decimal"/>
<xs:element name="b" type="xs:decimal"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
使用此代碼片段,我執行了一個 XQuery 運算式let $a := /root/a, $b := /root/b, $res := $a $b return $res:
var proc = new Processor(false);
var builder = proc.newDocumentBuilder();
builder.setBaseURI(URI.create("http://test.ru"));
var file = new File(filePath);
var doc = builder.build(file);
var expression = "let $a := /root/a, $b := /root/b, $res := $a $b return $res";
var compiler = proc.newXQueryCompiler();
var executable = compiler.compile(expression);
var selector = executable.load();
selector.setContextItem(doc);
return selector.evaluate();
結果是0.30000000000000004。根據這個問題(SaxonHE XQuery sum operation precision)這是因為默認number/xs:double型別。
然而,我有一個XSD中哪些元素a和b具有xs:decimal型別。有什么方法可以告訴 Saxon 在 XQuery 運算式執行中使用來自 XSD 的型別嗎?
uj5u.com熱心網友回復:
如果您能夠切換到 Saxon EE,那么您當然可以使用模式感知 XQuery 和例如https://www.w3.org/TR/xquery-31/#id-schema-import并且將使用模式并您的值將是xs:decimals。或者使用正確的設定,可以根據 schemaLocation 屬性(https://www.saxonica.com/html/documentation10/schema-processing/saqueryapi.html)決議和驗證檔案。
然而,即使在 HE 中,也沒有什么可以阻止您這樣做let $a := xs:decimal(/root/a), $b := xs:decimal(/root/b),您可能需要在查詢序言中宣告命名空間。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/331654.html
上一篇:從JSON負載中洗掉最外層節點
