xsd:来自分层节点结构的keyref

时间:2010-03-25 15:11:50

标签: xml xsd

我尝试使用节点/子节点结构中的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。这可以正确编译,但如果输入错误的keyref,则无法验证。

1 个答案:

答案 0 :(得分: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>

感谢任何人开始研究这个问题。