2015-09-17 37 views
1

我們與聲明的XSI命名空間中的Schematron如下Schematron的應用於不同XSI的命名空間

<schema xmlns="http://purl.oclc.org/dsdl/schematron" queryBinding='xslt2'> 
    <ns prefix="xsi" uri="http://www.w3.org/2001/XMLSchema-instance"/> 

我們這樣做,是因爲我們想定義的基於上下文的規則如下:

<rule context="*[@xsi:type='DATA_TYPE']">...</rule> 

這些規則對我們迄今收到的過去XML文件工作正常。然而,我們最近收到了其XML命名空間XSI定義爲:

xmlns:xsi="http://www.w3.org/2000/10/XMLSchema-instance" 

這個「新」 XSI命名空間導致上述不被解僱定義的規則(如規則不共享相同的XSI)。有沒有一種方法來定義schematron命名空間,使得規則獨立於xsi命名空間而被觸發?

總是可以根據local-name()=「type」來定義規則,而不是使用xsi:type,但我想知道是否有一個正確的(和更好的)實現方法。

+1

(略OT):在[XSI命名空間被保留(HTTP ://www.w3.org/2001/XMLSchema-instance)。從驗證角度來看,這個「新」xsi命名空間完全不是XSI命名空間,它只是另一個命名空間。另外,你應該不需要用你的模式檢查這個有效性**,quote:_「這增強了這些屬性的特殊狀態,這樣它們不僅不需要被聲明爲允許在實例中使用,而且也不能它也消除了對[例如xsi:type或xsi:nil]進行試驗的任何誘惑,這將會嚴重誤導,因爲它們沒有任何作用。「_ – Abel

+0

可能不是那種偏離主題的,因爲它提供瞭解決方案問題:) – Yampeku

回答

1

這是來自舊版規範的XMLSchema-instance名稱空間的一個版本。

您可以添加其他前綴聲明它:

<ns prefix="xsi_old" uri="http://www.w3.org/2000/10/XMLSchema-instance"/> 

,然後調整規則來測試兩種:

<rule context="*[@xsi:type='DATA_TYPE' or @xsi_old:type='DATA_TYPE']">...</rule> 
+0

但要做到這一點,你需要事先知道世界上所有的命名空間。我認爲可能會有更舊的版本漂浮。 – Yampeku

+0

然後,使用'local-name()'或者更寬泛地說,測試'namespace-uri()'來查看它是否包含'XMLSchema-instance',完全忽略名稱空間。 – kjhughes

+2

另一種方法是讓文檔所有者更新他們的XML(或者在您的正常Schematron處理之前自動更新它)。畢竟,「新」命名空間通過已有15年了。 – kjhughes

相關問題