2010-09-03 26 views
0

我需要在一个大的XML文件,以应用约束,就像这样:受限制的XPath(约束)允许什么?

<library> 
    <book> 
     <bookAuthor ID="1" nameAlias="PeerBR jr"/> 
    </book> 
    <book> 
     <bookAuthor ID="1"/> 
    </book> 
</library> 
<authorCatalogue> 
    <author ID="1" name="PeerBr"/> 
</authorCatalogue> 

我需要每个BOOKAUTHOR的ID来引用一个有效的作者。

我发现“受限制的XPath”非常笨拙,但可能会忽略某些东西。我是否有权定义约束是这样的:

<xs:keyref name="bookAuthor" refer="author"> 
    <xs:selector xpath="library/book/bookauthor"/> 
    <xs:field xpath="@ID"/> 
</xs:keyref>   
<xs:key name="author"> 
    <xs:selector xpath="authorCatalogue/author"/> 
    <xs:field xpath="@ID"/> 
</xs:key> 

它的工作原理,但我的文件实际上更多的是嵌套的,所以它变得非常混乱。另外我必须为“library/book/CoAuthor”写一个新的约束。有没有更优雅的,我可以做的?我不能缩写选择器吗?

我可以限制约束的应用吗(“bookauthor [@nameAlias]”)?

在此先感谢您的帮助。

+0

这个问题不是关于一般的XPath表达式。来自:http://www.w3.org/TR/xmlschema-1/#cIdentity-constraint_Definitions'{selector}指定一个受限制的XPath([XPath])表达式,相对于正在声明的元素的实例.'。所以,我编辑了你的标签。另外,从http://www.w3.org/TR/xmlschema-1/#coss-identity-constraint看起来,您可以使用'|'节点集合并运算符。所以,也许你可以使用'library/book/bookauthor |图书馆/书/ CoAuthor',但我不是XSchema专家... – 2010-09-03 18:41:47

+0

@Alejandro:是的,你是完全正确的,我已经阅读了架构并按照你的建议尝试了联盟运营商。谢谢。 – PeerBr 2010-09-03 19:06:44

回答

4

在O'Reilly的“XML Schema”中找到答案。它是确定有:

  • 与子元素的相对路径
  • 命名空间
  • 所有元素(“*”)
  • 任何子元素(“.//bookauthor”在我的情况会做招)

这是不正常包括任何幻想,比如:

  • 消减NT元素
  • 测试(“[@nameAlias]”,所以没办法申请约束只用nameAlias属性节点)
  • 绝对路径

希望这可以帮助别人绊倒的问题后。

相关问题