2014-02-10 2 views
1

В идентичности ограничения, нужно выбрать элемент «Арг», имеющий конкретное значение атрибута [@ типа = «синтаксического анализа»].
Но я получаю ошибку, Выражение 'action // @ type' недопустимо относительно подмножества XPath, поддерживаемого XML-схемой.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

selector и field ключа или схемы ключей XML Schema 1.0 поддерживают только ограниченное подмножество 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" '), тогда это самый простой подход, но если формат исправлен, вам придется искать в правила схемы для проверки перекрестной ссылки. –

Смежные вопросы