Xml 确保一个元素的内容等于一个键(keyref表示内容)

Xml 确保一个元素的内容等于一个键(keyref表示内容),xml,xsd,xsd-validation,Xml,Xsd,Xsd Validation,我在同一个XML文件中有两个不同元素的列表(ruleRef和rule)。 我想确保ruleRef的内容等于任何规则的名称 在我的XSD中,我已经有一个xs:key限制,比如: <xs:key name="ruleName"> <xs:selector xpath="rules/rule"/> <xs:field xpath="@name"/> </xs:key> <xs:k

我在同一个XML文件中有两个不同元素的列表(
ruleRef
rule
)。 我想确保
ruleRef
的内容等于任何
规则的名称

在我的XSD中,我已经有一个
xs:key
限制,比如:

<xs:key name="ruleName">
  <xs:selector xpath="rules/rule"/>
  <xs:field xpath="@name"/>
</xs:key>
<xs:keyref name="differentRuleRef" refer="ruleName">
  <xs:selector xpath="rules/rule/differentRuleRef"/>
  <xs:field xpath="@referencedRule"/>
</xs:keyref>

我以前也使用过这个键来验证另一个元素的属性,比如:

<xs:key name="ruleName">
  <xs:selector xpath="rules/rule"/>
  <xs:field xpath="@name"/>
</xs:key>
<xs:keyref name="differentRuleRef" refer="ruleName">
  <xs:selector xpath="rules/rule/differentRuleRef"/>
  <xs:field xpath="@referencedRule"/>
</xs:keyref>

现在我想验证元素而不是属性的实际内容。 例如,在以下XML中,第二个
元素应无效:


规则1
不存在的胃窦
我以前尝试过
text()
data(.)
,但它们在XPath子集中都无效。
我也尝试过
ruleRef
,但它们似乎没有验证任何东西。

xs:keyref
中对
xs:field
使用
应该有效,我怀疑XPath中对
xs:selector
的错误匹配

元素上,在模式中定义以下内容正在处理您提供的XML示例:

<xs:element name="root" type="root">
    <xs:key name="ruleName">
        <xs:selector xpath="rules/rule"/>
        <xs:field xpath="@name"/>
    </xs:key>
    <xs:keyref refer="ruleName" name="differentRuleRef">
        <xs:selector xpath="ruleRefs/ruleRef"/>
        <xs:field xpath="."/>
    </xs:keyref>
</xs:element>

<xs:complexType name="root">
   <!-- define root content type here ...-->
</xs:complexType>

这将限制规则名称的唯一性。

显然,我在使用
时犯了一个不同的错误,因为现在我使用了它,它立即起作用了……无论如何,谢谢:)