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

时间:2017-10-10 07:37:37

标签: xml xpath schematron

我是XML开发的新手,我只是阅读在线资料让我走了,所以我真的不是专家。我的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>

架构师错误 book-part seq =“4” book-part seq =“8”。似乎第一个嵌套书籍部分存在问题。是否有人可以帮我解决这个问题?

1 个答案:

答案 0 :(得分:0)

您在这里混合层次结构级别。在这种情况下,您需要的不仅是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}}