【问题标题】:XML / XSD how to create a keyXML/XSD 如何创建密钥
【发布时间】:2013-04-22 17:10:36
【问题描述】:

我在定义 XML Schema 中的键时遇到问题。

代码:

XSD:

 <xsd:element name="players">
    <xsd:complexType>
        <xsd:sequence>
            <xsd:element name="player" minOccurs="0" maxOccurs="unbounded">
                <xsd:complexType>
                    <xsd:all>
                        <xsd:element name="date-of-birth" type="xsd:date"></xsd:element>
                        <xsd:element name="gender">
                            <xsd:simpleType>
                                <xsd:restriction base="xsd:string">
                                    <xsd:enumeration value="MALE" />
                                    <xsd:enumeration value="FEMALE" />
                                </xsd:restriction>
                            </xsd:simpleType>
                        </xsd:element>
                    </xsd:all>
                    <xsd:attribute name="username" type="xsd:string" use="required" />
                </xsd:complexType>
                <xsd:key name="playerkey">
                    <xsd:selector xpath="players/player" />
                    <xsd:field xpath="username" />
                </xsd:key>
            </xsd:element>
        </xsd:sequence>
    </xsd:complexType>
</xsd:element>

请注意,这只是完整代码的摘录,但它显示了所有必要的信息。

XML

<t:players>
    <t:player username="Super Mario">
        <t:gender>FEMALE</t:gender>
        <t:date-of-birth>1995-11-29</t:date-of-birth>
    </t:player>
    <t:player username="Super Mario">
        <t:date-of-birth>1991-10-12</t:date-of-birth>
        <t:gender>MALE</t:gender>
    </t:player>
</t:players>

问题:

如您所见,我创建了两个名为“超级马里奥”的玩家。由于密钥应该是唯一的,这应该会抛出错误,但 xmllins 确实正确验证了文件

问题:

如何正确定义键,元素必须是唯一的。

【问题讨论】:

    标签: xml xsd key


    【解决方案1】:
    1. 将键声明移动到它适用的级别,在这种情况下,我假设您希望每个 在所有 中都是唯一的
    2. 您的架构中的 Xpath 表达式错误;用户名是一个属性,必须有 @ 前缀。
    3. 如果键选择的元素具有非空命名空间,则 xapth 表达式还必须使用 那些空间。
     <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
        elementFormDefault="qualified" targetNamespace="xyzzy" xmlns:t="xyzzy">
        <xsd:element name="players">
           <xsd:complexType>
                ...
        </xsd:complexType>
        <xsd:key name="playerkey">
            <xsd:selector xpath="t:player" />
            <xsd:field xpath="@username" />
        </xsd:key>
        </xsd:element>
    </xsd:schema>
    

    更新了命名空间限定。

    【讨论】:

    • 感谢您的帮助,但遗憾的是它仍然无法正常工作。我将它们移到播放器中并更改了 xpath,但它仍然可以使用两个非唯一元素正确验证
    • 好的,命名空间是问题所在:D 现在可以使用了,感谢您的帮助伙伴! :)
    【解决方案2】:

    在 XSD 中,如果您希望某个元素 R 中的每个元素 E 对 F 具有唯一值,则 R 的声明需要包含一个键定义,其中选择器从 R 中选择 E,而字段从 R 中选择 F E.

    【讨论】:

      猜你喜欢
      • 2020-11-20
      • 2020-04-15
      • 2011-04-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-31
      相关资源
      最近更新 更多