【问题标题】:Choice of Attribute(s) on XML instance for directly defined attributes or references为直接定义的属性或引用选择 XML 实例上的属性
【发布时间】:2010-10-11 15:13:55
【问题描述】:

我正在寻找一种为元素选择属性的变体,它可以直接设置或引用。

这就是我的想法:

<root>    
<element>
   <attribute ref="shortname" />
</element>
<element>
   <attribute name="shortname" isEditable="true" anotherattrib="0815" />
</element>
</root>

由于没有xml方案这不会是问题,因此如果需要元素属性的属性“名称”,则该属性的定义非常困难。

该方案可能如下所示

<xs:element name="attribute">
<xs:complexType>
<xs:attribute name="ref" use="required" />
<xs:attribute name="name" use="required" />
</xs:complexType>
</xs:element>

是否有可能在属性之间做出选择(类似于 xs:choice for elements )?就像如果元素属性中有一个名为 ref 的属性,则不允许使用其他属性。如果没有,必须设置属性“name”...

这个问题听起来纯属虚拟和学术,但如果有解决方案或者我的想法完全错误,我会很高兴:)

提前感谢您的帮助!

戴夫

【问题讨论】:

    标签: xml xsd


    【解决方案1】:

    在我看来,像你想要的那样定义 XML Schema 是不可能的。您应该使用不同的强制属性集定义两个不同的元素名称,例如 &lt;attribute&gt;&lt;attributeRef&gt;,或者您不应该将 "ref""name" 属性定义为 "required"

    XML Schema 不是验证数据的唯一方法,您不能在 XML Schema 的属性值之间定义一些角色。因此,如果您确实需要在 XML 文档中验证更复杂的关系,您可以使用 XPath 和 XSLT 来执行此操作(请参阅SchematronXML Schema Language ComparisonBeyond W3C XML SchemaImproving XML Document Validation with SchematronAdvanced XML validationUsing XSL as a Validation Language)。

    【讨论】:

    • 我认为表达这一点的唯一方法是:声明一个具有完整内容的复杂类型,声明两个具有限制的派生类型,在声明父内容时使用一个选项。
    • @Alejandro:您可以声明两种类型。这不是问题,但是如何用两个同名”和不同类型的元素定义选择?我不确定这是否可行。在我看来,您会收到元素“”的定义不明确的错误。
    • @Oleg:选择是在两个元素之间(每个元素都有不同的派生类型)但名称相同,在父声明中,例如:complexType named @987654332 @;名为 BaseA 的 complexType 派生自 Base,但有限制;对于名为 BaseB 的 complexType 也是如此;元素名称 Parent 可以选择名为 Child 的元素 BaseA 或名为 Child 的元素 BaseB 类型。
    • @Alejandro:对不起,但我不明白你为什么写评论而不是回答问题。如果我在 Visual Studio 2010 中创建一个 XML 模式并尝试编写 &lt;xs:choice&gt;&lt;xs:element name="attribute" type="baseAType"/&gt;&lt;xs:element name="attribute" type="baseBType"/&gt;&lt;/xs:choice&gt;,我会收到一个关于元素 &lt;attribute&gt; 的模棱两可声明的错误,就像我之前写给你的那样。 baseATypebaseBType 是否来自同一个父母并不重要。我有错误总是。如果您确实认为自己有解决方案,只需使用相应的架构写下您的答案。
    • @Oleg:我写了一个以 I think that 开头的评论。那么你的答案是我不确定这是否可能。之后,您似乎已经对其进行了测试。所以,疑点很明显。这就是为什么这是一条评论。
    【解决方案2】:

    这可以通过 XML Schema 1.1 断言来实现:

    <xsd:complexType name="AttributeType">
        <xsd:sequence />
        <xsd:attribute name="ref" type="xsd:string" />
        <xsd:attribute name="name" type="xsd:string" />
        <xsd:assert test="count(@ref | @name) = 1" />
    </xsd:complexType>
    

    assert 元素确保只使用refname 之一。

    【讨论】:

      猜你喜欢
      • 2018-09-05
      • 2021-07-17
      • 2017-08-28
      • 1970-01-01
      • 2019-08-30
      • 2021-08-02
      • 1970-01-01
      • 1970-01-01
      • 2016-06-05
      相关资源
      最近更新 更多