2013-05-02 49 views
1

我正在玩一些XSD文件中嵌入的schematron規則。這個例子是規範的例子之一,它在沒有名稱空間的情況下工作,但是當我引入一個名稱空間時,它會停止驗證,我無法弄清楚爲什麼。嵌入式schematron不能在具有命名空間的XML文檔中工作

的模式很簡單:

<?xml version="1.0" encoding="UTF-8"?> 
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" 
    targetNamespace="http://me.com/ns" xmlns:q="http://me.com/ns"> 
<xs:element name="socket"> 
    <xs:annotation> 
     <xs:appinfo> 
      <sch:pattern name="Mutually exclusive attributes on the socket element" 
       xmlns:sch="http://purl.oclc.org/dsdl/schematron"> 
       <sch:rule context="socket" > 
        <sch:assert test="@hostName and @hostAddress">On a socket element only one 
         of the attributes hostName and hostAddress are allowed, not 
         both.</sch:assert> 
       </sch:rule> 
      </sch:pattern> 
     </xs:appinfo> 
    </xs:annotation> 
    <xs:complexType> 
     <xs:attribute name="hostName" type="xs:string" use="optional"/> 
     <xs:attribute name="hostAddress" type="xs:string" use="optional"/> 
    </xs:complexType> 
</xs:element> 
</xs:schema> 

和被確認的文檔是:當被刪除的命名空間

<?xml version="1.0" encoding="UTF-8"?> 
<socket xmlns="http://me.com/ns" hostAddress="192.168.200.76"/> 

的Schematron的斷言解僱,但如上圖所示,他們不這樣做。我嘗試在上下文中引用命名空間<sch:rule context="q:socket">,但是隨後出現了schematron管道的編譯錯誤。

有沒有人知道他們的頭頂如何解決這個問題?

回答

1

這是一個更新的XSD,將工作:

<?xml version="1.0" encoding="UTF-8"?> 
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns="http://me.com/ns" targetNamespace="http://me.com/ns" xmlns:sch="http://purl.oclc.org/dsdl/schematron"> 
    <xs:annotation> 
     <xs:appinfo> 
      <sch:ns uri="http://me.com/ns" prefix="q"/>   
     </xs:appinfo> 
    </xs:annotation> 
    <xs:element name="socket"> 
     <xs:annotation> 
      <xs:appinfo> 
       <sch:pattern name="Mutually exclusive attributes on the socket element" xmlns:sch="http://purl.oclc.org/dsdl/schematron"> 
        <sch:rule context="q:socket"> 
         <sch:assert test="@hostName and @hostAddress">On a socket element only one 
          of the attributes hostName and hostAddress are allowed, not 
          both.</sch:assert> 
        </sch:rule> 
       </sch:pattern> 
      </xs:appinfo> 
     </xs:annotation> 
     <xs:complexType> 
      <xs:attribute name="hostName" type="xs:string" use="optional"/> 
      <xs:attribute name="hostAddress" type="xs:string" use="optional"/> 
     </xs:complexType> 
    </xs:element> 
</xs:schema> 

的Schematron需要命名空間前綴聲明如上所示。

+0

我將scheme元素更改爲',但是assert仍然無法觸發。 – 2013-05-02 16:15:38

+0

Aha,工作,但我不得不限定屬性''。謝謝:) – 2013-05-03 06:28:30

+0

我已經嘗試了註釋的XSD和提供的XML,如圖所示,它們按所述方式工作。按照模式,這些屬性不需要限定,所以你必須嘗試過別的。 – 2013-05-03 10:54:56

相關問題