1

我正在尝试为我的 xsd 编写 xs:unique 来限制容器的名称,并且列表对象具有唯一的名称,但无法使其工作。你能帮忙吗?

这是详细信息

我的对象结构就像下面的树。

App 
  |
  ---container
        |
         --list
              |
               ---container
                     |
                     --list

每个“容器”可以有 0 个或多个“列表”,每个“列表”可以有 0 个或多个“容器”。列表和容器都有“名称”属性和其他不同的属性。我想限制“名称”对于整个实例的容器和列表都是唯一的。我应该如何编写唯一选择器 xpath?这是架构。

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:my_app="http://www.cisco.com/myapp" elementFormDefault="qualified" attributeFormDefault="unqualified">
<xs:element name="app">
    <xs:annotation>
        <xs:documentation>Comment describing your root element</xs:documentation>
    </xs:annotation>
    <xs:complexType>
        <xs:sequence>
            <xs:element name="container" type="containerType"/>
        </xs:sequence>
    </xs:complexType>
    <xs:unique name="uniquename">
        <xs:selector xpath=""/>
        <xs:field xpath="@name"/>
    </xs:unique>
</xs:element>
<xs:complexType name="listType">
    <xs:sequence minOccurs="0" maxOccurs="unbounded">
        <xs:element name="container" type="containerType"/>
    </xs:sequence>
    <xs:attribute name="name"/>
</xs:complexType>
<xs:complexType name="containerType">
    <xs:sequence minOccurs="0" maxOccurs="unbounded">
        <xs:element name="list" type="listType"/>
    </xs:sequence>
    <xs:attribute name="name"/>
    </xs:complexType>
</xs:schema>
4

2 回答 2

0

CMSperberg-McQueen 几乎是对的。受限 XPath 语法的问题(如XSD 1.0 Structures的第 3.11.16 节所示)是在您的情况下它需要以 . (点)。

所以正确的解决方案是

    <xs:selector xpath=".//container|.//list"/>

@CMSperberg-McQueen 也正确地指出空格是合法的,不应引起任何问题。我确认现有的 Java 和 .NET 验证器对上述内容没有任何问题(带有或不带空格)。如果您在任何级别复制 name 属性的值,下面的 XML 将变为无效。

<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<!-- Sample XML generated by QTAssistant (http://www.paschidev.com) -->
<app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:my_app="http://www.cisco.com/myapp">
    <container name="anySimpleType1">
        <list name="anySimpleType2">
            <container name="anySimpleType3">
                <list name="anySimpleType4">
                    <container name="anySimpleType5">
                        <list name="anySimpleType6"/>
                        <list name="anySimpleType7"/>
                    </container>
                    <container name="anySimpleType8">
                        <list name="anySimpleType9"/>
                        <list name="anySimpleType10"/>
                    </container>
                </list>
                <list name="anySimpleType11">
                    <container name="anySimpleType12">
                        <list name="anySimpleType13"/>
                        <list name="anySimpleType14"/>
                    </container>
                </list>
            </container>
            <container name="anySimpleType16">
                <list name="anySimpleType17">
                    <container name="anySimpleType18">
                        <list name="anySimpleType19"/>
                        <list name="anySimpleType20"/>
                    </container>
                </list>
            </container>
        </list>
    </container>
</app>
于 2012-10-31T22:37:16.887 回答
0

我想你正在寻找

<xs:selector xpath="//container | //list"/>
于 2012-10-18T21:50:50.527 回答