XSD XPath 谓词来选择具有匹配属性的节点



在身份约束中,我需要选择一个具有特定属性值[@type='parse']
的元素"arg"。但是我得到了错误, 表达式"action//@type"对于 XML 架构支持的 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>

提前感谢,
基肖尔。

XML

Schema 1.0 键或 keyref 的selectorfield仅支持架构规范中定义的 XPath 的受限子集。 对于selector

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

特别是,这不支持谓词。

如果可以使用 XML Schema 1.1,则支持完整的 XPath 2.0 语言。

最新更新