[英]XML Schema keyref problems, possibly problem with recursive elements
好吧,我已经很久没碰过我的头了,我想我的大脑已经受了太多伤害,以至于忘记了莎士比亚。 没关系,我没那么用他。 这是我的问题。
我在xml文档的顶部有一个水果清单。 可以说这是“查找表”。
然后,我在下面构建一个菜单系统。 每个菜单可以具有更多菜单或产品列表。 这些产品必须与顶部的水果相对应。
我已经能够确认正在填充水果列表,甚至可以获取keyref来验证菜单的一级。 但是我无法验证整个菜单树。 我已经用<!-- KEY FAIL -->
FAIL- <!-- KEY FAIL -->
标记了我尝试运行使用keyref的位置。
我正在使用xmllint进行验证。 如果我在其中使用//进行任何xpath操作,我将得到“无法编译”。
这是示例xml:
<Snarf xmlns="" xsi:noNamespaceSchemaLocation="mySchema.xsd"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<Fruit name="apple" />
<Fruit name="orange" />
<Fruit name="watermelon" />
<Blarg>
<Menu name="Top Menu">
<Menu name="Skillz">
<Menu name="Juizy">
<Product>orange</Product>
<Product>watermelon</Product>
</Menu>
<Menu name="nutty">
<Product>orange</Product>
</Menu>
</Menu>
<Menu name="Applz">
<Product>apple</Product>
</Menu>
</Menu>
</Blarg>
</Snarf>
这是xsd:
<xs:complexType name="productmenu">
<xs:choice minOccurs="1" maxOccurs="1">
<xs:choice minOccurs="1" maxOccurs="unbounded">
<xs:element name="Menu" type="productmenu">
<!-- KEY FAIL -->
<!-- <xs:keyref name="subMenuProductRef" refer="productNumber">
<xs:selector xpath="Menu"/>
<xs:field xpath="Product"/>
</xs:keyref> -->
</xs:element>
</xs:choice>
<xs:choice minOccurs="1" maxOccurs="unbounded">
<xs:element name="Product" type="xs:integer"
minOccurs="1" maxOccurs="unbounded"/>
</xs:choice>
</xs:choice>
<xs:attribute name="name" type="xs:string" use="required" />
</xs:complexType>
<xs:element name="Snarf">
<xs:complexType>
<xs:choice minOccurs="0" maxOccurs="unbounded">
<xs:element name="Fruit" maxOccurs="unbounded" minOccurs="1" type="string"/>
<xs:element name="Blarg" maxOccurs="unbounded" minOccurs="0">
<xs:complexType>
<xs:sequence>
<xs:element name="Menu" type="productmenu"
maxOccurs="unbounded" minOccurs="1">
<!-- KEY FAIL -->
<!-- <xs:keyref name="subMenuProductRef" refer="productNumber">
<xs:selector xpath="Menu"/>
<xs:field xpath="Product"/>
</xs:keyref>-->
</xs:element>
</xs:sequence>
<xs:attribute name="name" type="xs:string" use="required" />
</xs:complexType>
<!-- KEY FAIL -->
<!-- <xs:keyref name="menuProductRef" refer="productNumber">
<xs:selector xpath="Menu"/>
<xs:field xpath="Product"/>
</xs:keyref> -->
</xs:element>
</xs:choice>
</xs:complexType>
<xs:key name="productNumber">
<xs:selector xpath="./Product"/>
<xs:field xpath="@num"/>
</xs:key>
<!-- KEY FAIL -->
<!-- <xs:keyref name="menuProductRef" refer="productNumber">
<xs:selector xpath="./Blarg/Menu"/>
<xs:field xpath="Product"/>
</xs:keyref> -->
</xs:element>
选择器是相对于它的背景,所以用keyRef
内部Menu
,选择将在Product
选择中和场仅仅是.
:
<xs:element name="Menu" type="productmenu">
<xs:keyref name="subMenuProductRef" refer="productNumber">
<xs:selector xpath="Product"/>
<xs:field xpath="."/>
</xs:keyref>
</xs:element>
您的xs:key
需要更像是:
<xs:key name="productNumber">
<xs:selector xpath="./Fruit"/>
<xs:field xpath="@name"/>
</xs:key>
但是我猜想您只是没有像其他部分一样对示例进行消毒。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.