2017-10-10 4 views
1

Je suis très nouveau dans le développement XML et je viens de lire des documents en ligne pour me permettre de partir, donc je ne suis pas vraiment un expert. J'ai un problème avec mon fichier schematron.xpath pour vérifier la séquence correcte des parties de livre avec @seq

Problème: Le schématron doit vérifier si chaque partie du livre est en séquence via @seq. Cependant, mon tag schematron actuel ne fonctionne pas pour les parties de livre imbriquées.

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> 

marquage 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>

Les erreurs Schematron partie du livre seq = "4" et parties du livre seq = "8". Il semble qu'il y ait un problème avec la première partie livre imbriquée. Est-ce qu'il y a quelqu'un qui pourrait m'aider avec ça?

Répondre

0

Vous mélangez des niveaux de hiérarchie ici. Ce dont vous avez besoin dans ce cas n'est pas seulement preceding:: mais aussi parent::. (Par cohérence, je pense que cela devrait recommencer à partir du sous-niveau, mais ce n'est que mon opinion personnelle et non le point ici.) Vous pouvez tester si @seq est correct en le comparant au nombre de parties de livre précédentes et ancêtres. ensemble:

<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> 

Je traiterais l'autre condition (précédentes parties de livres doivent avoir @seq) dans une règle distincte:

<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

Oh oui, cela semble plus simple de comparer à ce que j'ai en ce moment. – Tin

+0

Très apprécié! –