【问题标题】:XML Schema keyref problems, possibly problem with recursive elementsXML Schema keyref 问题,可能是递归元素的问题
【发布时间】:2011-04-23 22:25:20
【问题描述】:

好吧,我已经用头撞这个很久了,我想我的大脑已经严重受损,以至于忘记了莎士比亚。没关系,我不怎么用他。这是我的问题。

我在 xml 文档的顶部有一个水果列表。这就是所谓的“查找表”。

然后我在下面构建一个菜单系统。每个菜单可以有更多菜单或产品列表。这些产品必须与顶部的水果相对应。

我已经能够确认正在填充水果列表,甚至可以获取 keyref 来验证菜单的一级。但我无法让它验证整个菜单树。我已经用<!-- 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>

【问题讨论】:

    标签: xml recursion xsd keyref


    【解决方案1】:

    选择器是相对于其上下文的,因此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>
    

    但我猜你只是没有像其他部分一样对示例进行消毒。

    【讨论】:

    • 抱歉,我不得不同时处理其他项目。我检查了,你的方法看起来不错。但我仍然没有得到我想要的功能。尽管如此,我还是给了它检查,只是基于它让我更接近答案的事实。那我不知道我是否有时间全面检查。感谢您的帮助!
    猜你喜欢
    • 2011-12-22
    • 2021-05-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-24
    • 2012-09-10
    • 1970-01-01
    • 2021-09-22
    相关资源
    最近更新 更多