使用XML Schema,我们可以在XML文档中的组件之间定义ID / IDREF链接。我正在寻找一种方法,使用XPath来确保只有某些ID可以用作IDREF - 即只有那些在架构设计的上下文中逻辑上产生感知的值。
使用下面的示例,我如何确保图书的library_id实际上是可用的library_id之一,而不是可能出现在消息中并用于某些完全不同目的的其他ID(但仍然是架构有效)。
<books>
<book library_id="lib1">
<author>A</author>
<title>B</title>
</book>
<book library_id="lib2">
<author>C</author>
<title>D</title>
</book>
<library id="lib1">
<name>X</name>
<city>Y</city>
</library>
<library id="lib2">
<name>X</name>
<city>Y</city>
</library>
</books>
最接近我的工作是使用包含XPath的函数,例如。
contains(//library/@id,//book/@library_id)
但是这会引发错误,因为不允许多个项目的序列作为contains()的第一个参数(&#34; lib1&#34;,&#34; lib2&#34;)。
由于
答案 0 :(得分:0)
我希望能够正确理解你想要的东西
图书馆列表中存在library_id的图书
//book[@library_id = //library/@id]
库不正确的图书
//book[not(@library_id = //library/@id)]
答案 1 :(得分:0)
为什么不使用XSD的key / keyref约束而不是ID / IDREF?这些更灵活:它们可以限定任何元素而不是整个文档;您可以在文档中使用不同类型的ID,并且引用必须匹配相同的类型;值可以是复合的(例如,名字+姓氏);值可以是任何数据类型。