在XML Schema中使用keyref处理具有值列表的属性

8

我正在尝试设计一个模式来验证应用程序中已使用的XML格式(XML格式没有太多重新设计的空间)。

我试图利用XML模式字典中的key和keyref元素来验证身份约束。

其中一个特定问题是XML如何建模一对多关系。

<spaceships>
    <spaceship guns="gun1 gun2 gun3"/>
</spaceships>
<guns>
    <gun id="gun1"/>
    <gun id="gun2"/>
    <gun id="gun3"/>
</guns>

我想到了在我的模式中使用这对键/键引用(key/keyref)。
<xs:key name="gunKey">
    <xs:selector xpath="guns/gun" />
    <xs:field xpath="@id" />
</xs:key>

<xs:keyref name="gunRef" refer="gunKey">
    <xs:selector xpath="spaceships/spaceship" />
    <xs:field xpath="@guns" />
</xs:keyref>

这段文本无法通过Xerces验证:

元素的唯一约束条件中未找到值为“gun1 gun2 gun3”的“gunRef”键。

有没有办法在模式中表达列表的值为对另一个实体的逗号分隔引用,并且仍然能够获得唯一约束条件验证的好处?

1个回答

1

很抱歉,您无法为类似于guns="gun1 gun2 gun3"的属性创建此类引用,因为gun1 gun2 gun3是一个简单的字符串,不能自动分成三个独立的部分。

编辑1:如果您想匹配这样的属性,请查看此问答:XML模式;从有效属性值列表中选择多个


是的,我明白......我想可能可以在键或键引用元素中使用一些XPath魔法来避免重新设计XML格式..... - artur
@artur,那么请看一下这个QA:https://dev59.com/questions/hl7Va4cB1Zd3GeqPNMsc - Andremoniy
1
你链接的问题更多地涉及表达少量已知值的排列,而我在这里处理的是身份验证,这并不相同。我需要验证列表中的每个项目是否是文档中某个元素的主键。谢谢。 - artur
xs:IDREFS 怎么样? - Steve

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接