【问题标题】:How to set restriction on XSD for id attributes如何为 id 属性设置 XSD 限制
【发布时间】:2013-04-03 05:18:31
【问题描述】:

如果我想定义一个 XSD 文件:

<state id="1" name="S1">
<state id="2" name="S2">
<state id="3" name="S3">

<transition fromState="1" toState="2">

如何在 XSD 文件中限制属性 fromStatetoState 以仅获取在 state 元素 id 上声明的值?

XSD 定义似乎没有这样的功能,而是采用 Android XML 布局,不知何故 Eclipse Android XML 编辑器知道将哪些 id 放入内容辅助列表中。

【问题讨论】:

    标签: android xml xsd


    【解决方案1】:

    推荐的方法是使用 unique/key/keyref 结构。考虑到这个修改过的 XML(添加一个文档元素):

    <Document>
        <state id="1" name="S1"/>
        <state id="2" name="S2"/>
        <state id="3" name="S3"/>
    
        <transition fromState="1" toState="2"/>
    </Document>
    

    这个 XSD 完全符合您的要求:

    <?xml version="1.0" encoding="utf-8"?>
    <!--XML Schema generated by QTAssistant/XML Schema Refactoring (XSR) Module (http://www.paschidev.com)-->
    <xsd:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
        <xsd:element name="Document">
            <xsd:complexType>
                <xsd:sequence>
                    <xsd:element maxOccurs="unbounded" name="state">
                        <xsd:complexType>
                            <xsd:attribute name="id" type="xsd:unsignedByte" use="required"/>
                            <xsd:attribute name="name" type="xsd:string" use="required"/>
                        </xsd:complexType>
                    </xsd:element>
                    <xsd:element name="transition">
                        <xsd:complexType>
                            <xsd:attribute name="fromState" type="xsd:unsignedByte" use="required"/>
                            <xsd:attribute name="toState" type="xsd:unsignedByte" use="required"/>
                        </xsd:complexType>
                    </xsd:element>
                </xsd:sequence>
            </xsd:complexType>
            <xsd:key name="PKStates">
                <xsd:selector xpath="state"/>
                <xsd:field xpath="@id"/>
            </xsd:key>
            <xsd:keyref name="FKTransitionToStatesFrom"  refer="PKStates">
                <xsd:selector xpath="transition"/>
                <xsd:field xpath="@fromState"/>
            </xsd:keyref>
            <xsd:keyref name="FKTransitionToStatesTo" refer="PKStates">
                <xsd:selector xpath="transition"/>
                <xsd:field xpath="@toState"/>
            </xsd:keyref>
        </xsd:element>
    </xsd:schema>
    

    如果您看一下图表,您可以更轻松地想象选择器的工作原理。如果您决定使用它并且您的 XSD 有一个目标命名空间,并且如果您限定了您的元素和/或属性,请确保为 targetNamespace 声明一个前缀并在您的 XPath 中使用该前缀。

    一般来说,虽然知道如何使用此信息(key/keyref)来构建内容辅助列表以促进基于相关 XSD 的 XML 编辑的工具不多。通常具有专业性质的编辑器会根据硬连线实现而不是仅从 XSD 推断来执行此操作。

    【讨论】:

    • 用于 XSD 的酷工具,它是什么?它会自动生成 XSD 吗?感谢你的回答。此外,让我告诉你,我从你的回答中学到了我什至没有问过的新东西。
    • 顺便说一下,我用的是Eclipse。当我使用您的答案创建 XSD 文件时,@id、@fromState、@toState xsd:field 出现 3 个错误。 Error: No resource type specified (at 'xpath' with value '@fromState')。 ::: 使用 xsd 创建了一个带有 XMLSchema-instance 的测试 XML 文件,并且验证工作正常,即使我提到了 3 个错误。 ::: 你知道吗?我想我会提出一个新问题。
    • 我发布的架构是有效的 - 使用最新的 .NET 和 Xerces (Java) 对其进行了测试。无效内容的验证错误如下:Error occurred while loading [], line 7 position 3 The key sequence '13' in Keyref fails to refer to some key. ...:\some.xml is XSD 1.0 invalid. Error while loading [], line 7 position 12 cvc-identity-constraint.4.3: Key 'FKTransitionToStatesFrom' with value '13' not found for identity constraint of element 'Document'. ...:\some.xml is XSD 1.0 invalid.
    • @ilomambo,请参阅上面的评论和您其他问题的答案。
    猜你喜欢
    • 2018-08-20
    • 2012-12-25
    • 1970-01-01
    • 2012-03-26
    • 2016-10-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多