【问题标题】:xsd xpath predicates to select node with matching attributexsd xpath 谓词选择具有匹配属性的节点
【发布时间】:2014-02-10 08:23:12
【问题描述】:

在身份约束中,我需要选择一个元素 "arg" 具有特定的属性值 [@type='parse']
但我收到错误, 对于 XML Schema 支持的 XPath 子集,表达式 'action//@type' 无效。

对于下面的语句,

<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 xsd


    【解决方案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 语言。

    【讨论】:

    • 感谢您的回答伊恩。 libxml2 不支持 XPath 2.0。还有其他解决方法吗?
    • @NandkishorBiradar 如果您可以稍微修改 XML 格式(例如,使用名为 parseArg 而不是 arg type="parse" 的元素),那么这是最简单的方法,但如果格式是固定的,您将拥有查看 schematron 规则以验证交叉引用。
    猜你喜欢
    • 2015-07-09
    • 1970-01-01
    • 2013-11-30
    • 1970-01-01
    • 1970-01-01
    • 2013-10-11
    • 2017-08-01
    • 2012-02-20
    • 1970-01-01
    相关资源
    最近更新 更多