xpath使用@seq检查书籍部分的正确顺序

xpath使用@seq检查书籍部分的正确顺序

问题描述:

我是XML开发领域的新手,我刚刚阅读了在线资料以帮助我走,所以我并不是专家。我的schematron文件有问题。xpath使用@seq检查书籍部分的正确顺序

问题: schematron需要检查每个书籍部分是否通过@seq顺序排列。但是,我目前的schematron标签不适用于嵌套书籍部分。

XML:

<book> 
    <meta>....</meta> 
    <body> 
    <book-part seq="1">....</book-part> 
    <book-part seq="2">....</book-part> 
    <book-part seq="3"> 
     <book-part-meta>....</book-part-meta> 
     <book-body> 
      <book-part seq="4">....</book-part> 
      <book-part seq="5">....</book-part> 
      <book-part seq="6">....</book-part> 
     </book-body> 
    </book-part> 
    <book-part seq="7"> 
     <book-part-meta>....</book-part-meta> 
     <book-body> 
      <book-part seq="8">....</book-part> 
      <book-part seq="9">....</book-part> 
      <book-part seq="10">....</book-part> 
     </book-body> 
    </book-part> 
    <book-part seq="11">....</book-part> 
    <book-part seq="12">....</book-part> 
</body> 
</book> 

Schematron的标记:
<rule context="book-part[@seq]"> <report role="error" test="preceding::book-part[@seq] and number(@seq) != (number(preceding::book-part[1]/@seq) + 1)">Book-parts must be in sequence</report> </rule>

的Schematron的错误书部分SEQ = “4”书部分SEQ = “8”。看起来第一个嵌套书本部分存在问题。有没有人可以帮助我呢?

您在这里混合层级。在这种情况下,您需要的不仅是preceding::,还有parent::。 (为了保持一致性,我认为它应该从1开始,但这只是我个人的意见,而不是这里的重点。)通过将@seq与前面和祖先书籍部分的数量进行比较,可以测试它是否正确一起:

<pattern id="test"> 
    <rule context="book-part[@seq]"> 
     <report role="error" 
      test="number(@seq) != count(ancestor::book-part[@seq] | preceding::book-part[@seq]) + 1" 
      >Book-parts must be numbered in sequence</report> 
    </rule> 
</pattern> 

我会在一个单独的规则对待其他条件(前书的部分必须有@seq):

<pattern id="test2"> 
    <rule context="book-part[@seq]"> 
     <report role="error" 
      test="preceding::book-part[not(@seq)] | ancestor::book-part[not(@seq)]" 
      >Book-parts must be numbered</report> 
    </rule> 
</pattern> 
+1

哦,是的,这似乎更简单比较一下我的时刻。 – Tin

+0

非常感谢! –