Ciao a tutti.
Io ho la necessità di validare dei file xml prodotti da codice Java mediante gli schematron. Il file xml ha questa forma:
codice:
<root>
<nodeA>
         <nodeB>
                     <nodeC>
                                 <nodeD>abcd</nodeD>
                                 <nodeE>abcd</nodeE>
                                 <nodeF>1</nodeF> 
                     </nodeC>
                     <nodeC>
                                 <nodeD>abcd</nodeD>
                                 <nodeE>abcd</nodeE>
                                 <nodeF>1</nodeF> 
                     </nodeC>
          </nodeB> 
</nodeA>
<nodeA>
         <nodeB>
                     <nodeC>
                                 <nodeD>abcd</nodeD>
                                 <nodeE>abcd</nodeE>
                                 <nodeF>1</nodeF> 
                     </nodeC>
                     <nodeC>
                                 <nodeD>abcd</nodeD>
                                 <nodeE>abcd</nodeE>
                                 <nodeF>1</nodeF> 
                     </nodeC>
          </nodeB> 
</nodeA>
</root>  (<--<root> è solo un esempio, il file xml vero è chiuso con gli header appropriati)
Per validare questo tipo di file xml uso la seguente regola schematron:
codice:
    <iso:pattern>
        <iso:rule context="nodeC">
            <assert test="exists(nodeF) and nodeF > 0">nodeB[<value-of select="(index-of(../../nodeB, ..)-1)" />].nodeC[<value-of select="(index-of(../nodeC, self::node())-1)" />].nodeF#Un messaggio di errore.  
            </assert>        
        </iso:rule>        
    </iso:pattern>
Ora questa regola funziona con i file xml campione prodotti da Oxygen, mentre non funziona affatto con i file xml prodotti dal codice Java. In particolare il messaggio di errore che riscontro è che index-of produce una sequence di più di un elemento, per cui non può effettuare la sottrazione (richiesta dal codice Java per visualizzare i messaggi di errore correttamente).
La differenza fra i due file xml prodotti è che l'elemento nodeF, che è opzionale come tutti gli altri, non viene prodotto se nella maschera il corrispondente campo non viene valorizzato.