使用XPath可以检查ID / IDREF吗?

时间:2016-07-19 09:38:18

标签: xpath

使用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;)。

由于

2 个答案:

答案 0 :(得分:0)

我希望能够正确理解你想要的东西

图书馆列表中存在library_id的图书​​

//book[@library_id = //library/@id]

库不正确的图书

//book[not(@library_id = //library/@id)]

答案 1 :(得分:0)

为什么不使用XSD的key / keyref约束而不是ID / IDREF?这些更灵活:它们可以限定任何元素而不是整个文档;您可以在文档中使用不同类型的ID,并且引用必须匹配相同的类型;值可以是复合的(例如,名字+姓氏);值可以是任何数据类型。