2010-03-25 4 views
0

Я пытаюсь ссылаться на xsd: keyref изнутри структуры узла/субнода на глобальную таблицу, которая является дочерним элементом корневого элемента xml.xsd: keyref из структуры иерархических узлов

Вот пример XML

<?xml version="1.0" encoding="UTF-8"?> 
<Root xmlns="http://www.example.org/keyTest" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xsi:schemaLocation="http://www.example.org/keyTest keyTest.xsd"> 

<Globals key="key1"/> 
<Globals key="key2"/> 
<Globals key="key3"/> 

<Node> 
<SubNode keyref="key2"/> 
<SubNode keyref="key3"/>  
<SubNode keyref="key1"> 
    <SubNode keyref="key2"> 
     <SubNode keyref="key1"/> 
    </SubNode> 
</SubNode>  
</Node> 
</Root> 

У меня также есть XSD, определяющий XSD: ключ и XSD: KeyRef полей в документе. Эти ключи должны проверять, что все значения keyref находятся в глобальной таблице в начале документа xml. До сих пор я не понял, что может быть проблемой с выражением выбора xpath.

<?xml version="1.0" encoding="UTF-8"?> 
<schema xmlns="http://www.w3.org/2001/XMLSchema" 
     targetNamespace="http://www.example.org/keyTest" 
     xmlns:tns="http://www.example.org/keyTest" 
     elementFormDefault="qualified"> 

<complexType name="Global"> 
    <attribute name="key" type="string"/> 
</complexType> 

<complexType name="Node" > 
    <sequence maxOccurs="unbounded"> 
     <element name="SubNode" type="tns:Node" minOccurs="0"/> 
    </sequence> 
    <attribute name="keyref" type="string"/> 
</complexType> 

<complexType name="Root"> 
    <sequence> 
     <element name="Globals" type="tns:Global" maxOccurs="unbounded"/> 
     <element name="Node" type="tns:Node" maxOccurs="1"/> 
    </sequence> 
</complexType> 

<element name="Root" type="tns:Root"> 
    <key name="key"> 
     <selector xpath="Global"/> 
     <field xpath="@key"></field> 
    </key> 
    <keyref name="keyref" refer="tns:key"> 
     <selector xpath="//SubNode"/> 
     <field xpath="@keyref"/> 
    </keyref> 
</element> 

Проблема заключается в том, что вопросы xmllint, что «// подузел» не может быть скомпилирован

keyTest.xsd:30: element selector: Schemas parser error : 
     Element '{http://www.w3.org/2001/XMLSchema}selector', at 
     atribute 'xpath': The XPath expression '//SubNode' could not be compiled. 
     WXS schema keyTest.xsd failed to compile 

Когда я пытаюсь выражение XPath с XPATH валидатор он выбирает все подузлы в документе как определено в стандарте W3C, так почему же этот xpath не работает в выражении селектора?

Я также пробовал .//SubNode. Это правильно компилируется, но не проверяет, не введен ли я неправильный ключ.

ответ

2

Мне нравится делиться полученным решением.

Правильный XSD, как это пространство имен не хватает:

<?xml version="1.0" encoding="UTF-8"?> 
<schema xmlns="http://www.w3.org/2001/XMLSchema" 
     targetNamespace="http://www.example.org/keyTest" 
     xmlns:tns="http://www.example.org/keyTest" 
     elementFormDefault="qualified"> 

<complexType name="Global"> 
    <attribute name="key" type="string"/> 
</complexType> 

<complexType name="Node" > 
    <sequence maxOccurs="unbounded"> 
     <element name="SubNode" type="tns:Node" minOccurs="0"/> 
    </sequence> 
    <attribute name="keyref" type="string"/> 
</complexType> 

<complexType name="Root"> 
    <sequence> 
     <element name="Globals" type="tns:Global" maxOccurs="unbounded"/> 
     <element name="Node" type="tns:Node" maxOccurs="1"/> 
    </sequence> 
</complexType> 

<element name="Root" type="tns:Root"> 
    <key name="key"> 
     <selector xpath=".//tns:Globals"/> 
     <field xpath="@key"></field> 
    </key> 
    <keyref name="keyref" refer="tns:key"> 
     <selector xpath=".//tns:SubNode"/> 
     <field xpath="@keyref"/> 
    </keyref> 
    <unique name="uniqKey"> 
     <selector xpath=".//tns:Globals"/> 
     <field xpath="@key"/> 
    </unique> 
</element> 

Благодаря никому начал работать над этим.

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