2014-02-10 125 views
1

在身份約束中,我需要選擇具有特定屬性值[@ type ='parse']的元素「arg」
但是我收到錯誤, 對於XML Schema支持的XPath子集,表達式'action // @ type'無效。xsd xpath謂詞選擇具有匹配屬性的節點

對於下面的語句,

<xs:selector xpath="action/arg[@type='parse']"/>

完整的XSD文件,

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> 

    <xs:element name="test"> 
     <xs:complexType> 
     <xs:sequence> 
      <xs:element ref="page" maxOccurs="32"/> 
     </xs:sequence> 
     </xs:complexType> 
    </xs:element> 

    <xs:element name="page"> 
     <xs:complexType> 
     <xs:sequence> 
      <xs:element ref="parse"/> 
      <xs:element ref="action"/> 
     </xs:sequence> 
     </xs:complexType>    

     <xs:keyref name="arg_key_ref" refer="assert_key"> 
     <xs:selector xpath="action/arg[@type='parse']"/> 
     <xs:field xpath="."/> 
     </xs:keyref> 

     <xs:key name="assert_key"> 
     <xs:selector xpath="parse/parameter/name"/> 
     <xs:field xpath="."/> 
     </xs:key> 

    </xs:element> 

    <xs:element name="parse"> 
     <xs:complexType> 
     <xs:sequence> 
      <xs:element ref="parameter" maxOccurs="32"/> 
     </xs:sequence> 
     </xs:complexType> 
    </xs:element> 

    <xs:element name="action"> 
     <xs:complexType> 
     <xs:sequence>    
      <xs:element ref="arg" maxOccurs="32"/> 
     </xs:sequence> 
     </xs:complexType> 
    </xs:element> 

    <xs:element name="parameter"> 
     <xs:complexType> 
     <xs:sequence> 
      <xs:element name="name" type="xs:string"/> 
     </xs:sequence> 
     </xs:complexType> 
    </xs:element> 

    <xs:element name="arg"> 
     <xs:complexType> 
     <xs:simpleContent> 
      <xs:extension base="xs:string"> 
       <xs:attribute name="type" type="xs:string"/> 
      </xs:extension> 
     </xs:simpleContent> 
     </xs:complexType> 
    </xs:element> 

</xs:schema> 

由於提前,
基肖爾。

回答

1

XML Schema 1.0密鑰或keyref的selectorfield僅支持XPath的限制子集as defined in the schema specification。對於selector

[1] Selector ::= Path ('|' Path)* 
[2] Path  ::= ('.//')? Step ('/' Step)* 
[3] Step  ::= '.' | NameTest 
[4] NameTest ::= QName | '*' | NCName ':' '*' 

尤其是這樣做支持謂詞。

如果您可以使用XML Schema 1.1,那麼它支持完整的XPath 2.0語言。

+0

感謝您的回答伊恩。 libxml2不支持XPath 2.0。有沒有其他解決方法? –

+0

@NandkishorBiradar如果你可以稍微修改XML格式(例如,使用一個名爲'parseArg'的元素而不是'arg type =「parse」'),那麼這是最簡單的方法,但是如果格式是固定的,你必須看看放入schematron規則以驗證交叉引用。 –

相關問題