我希望在XPath 1.0中找到一种在密钥和keyref之间创建约束的方法。
假设我有一个XML文档 -
<?xml version="1.0" encoding="utf-8" ?>
<root xmlns="schema.xsd">
<items>
<item id="1"/>
<item id="2"/>
<item id="3"/>
</items>
<group>
<items>
<item ref="2"/>
</items>
</group>
</root>
我需要确保“group”下面列出的所有项目都引用根/项目列表中的项目。
对于我的XSD,我尝试了许多不同的方法,但都没有。
例如,
<?xml version="1.0" encoding="utf-8"?>
<xs:schema xmlns="schema.xsd"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
targetNamespace="schema.xsd" elementFormDefault="qualified"
id="schema">
<xs:element name="root">
<xs:complexType>
<xs:sequence>
<xs:element name="items">
<xs:complexType>
<xs:sequence maxOccurs="unbounded">
<xs:element name="item">
<xs:complexType>
<xs:attribute name="id"/>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="group" maxOccurs="unbounded">
<xs:complexType>
<xs:sequence>
<xs:element name="items">
<xs:complexType>
<xs:sequence maxOccurs="unbounded">
<xs:element name="item">
<xs:complexType>
<xs:attribute name="ref"/>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
<xs:keyref name="itemIdRef" refer="itemId">
<xs:selector xpath="item"/>
<xs:field xpath="@ref"/>
</xs:keyref>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
<xs:key name="itemId">
<xs:selector xpath="./root/items/item"/>
<xs:field xpath="@id"/>
</xs:key>
</xs:element>
</xs:schema>
取决于验证程序,当使用存在的id时,“...具有引用范围之外的Key或唯一的Keyref”会抛出,或者无论使用哪种ID,都不会抛出任何错误。无论哪种方式,我都没有设法让这个XSD在任何验证器中成功验证,因此我用于密钥和keyref的选择器必须是错误的。
有人能发现我出错的地方吗?
答案 0 :(得分:0)
尝试使用以下内容:
<xs:schema xmlns:fx="schema.xsd"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
targetNamespace="schema.xsd" elementFormDefault="qualified"
id="schema">
<xs:element name="root">
<xs:complexType>
<xs:sequence>
<xs:element name="items">
<xs:complexType>
<xs:sequence maxOccurs="unbounded">
<xs:element name="item">
<xs:complexType>
<xs:attribute name="id"/>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
<xs:key name="itemId">
<xs:selector xpath="fx:item"/>
<xs:field xpath="@id"/>
</xs:key>
</xs:element>
<xs:element name="group" maxOccurs="unbounded">
<xs:complexType>
<xs:sequence>
<xs:element name="items">
<xs:complexType>
<xs:sequence maxOccurs="unbounded">
<xs:element name="item">
<xs:complexType>
<xs:attribute name="ref"/>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
<xs:keyref name="itemIdRef" refer="fx:itemId">
<xs:selector xpath="fx:group/fx:items/fx:item"/>
<xs:field xpath="@ref"/>
</xs:keyref>
</xs:element>