xsd: keyref из структуры иерархических узлов - PullRequest
0 голосов
/ 25 марта 2010

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

Вот пример 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: key и 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 выдает, что "// SubNode" не может быть скомпилирован

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. Это правильно компилируется, но не ошибается, если я ввожу неверный ключ.

1 Ответ

2 голосов
/ 25 марта 2010

Мне нравится делиться найденным решением.

Правильный 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>

Спасибо, кто-нибудь начал работать над этим.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...