2014-09-23 10 views
5

Supponiamo che io sono un file XML che assomiglia a questo:In che modo uno schema XML richiede che gli elementi siano ordinati per attributo?

<Transactions> 
<Transaction OrderID="5"> ... </Transaction> 
<Transaction OrderID="6"> ... </Transaction> 
<Transaction OrderID="11"> ... </Transaction> 
<Transaction OrderID="7"> ... </Transaction> 
</Transactions> 

Utilizzando schema XML, è possibile indicare che Order # 11 non è nella sequenza corretta? Ogni elemento Transaction passa individualmente la convalida, ma l'OrderID deve essere in ordine crescente.

E una domanda correlata: una regola di convalida può indicare se i numeri possono essere saltati o meno? Per esempio, non v'è alcuna transazione # 8,9, o 10.

risposta

1

Se il validatore supporta XSD 1.1, è possibile utilizzare xs: affermare di negare certi valori degli attributi in questo modo:

<?xml version="1.0" encoding="UTF-8"?> 
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" 
      xmlns:vc="http://www.w3.org/2007/XMLSchema-versioning" 
      elementFormDefault="qualified" 
      attributeFormDefault="unqualified" 
      vc:minVersion="1.1"> 
    <xs:element name="Transactions"> 
     <xs:complexType> 
     <xs:sequence> 
      <xs:element name="Transaction" maxOccurs="unbounded"> 
       <xs:complexType mixed="true"> 
        <xs:attribute name="OrderID" type="xs:integer"/> 
        <xs:assert test="empty(index-of((8,9,10),@OrderID))"/> 
       </xs:complexType>         
      </xs:element> 
     </xs:sequence> 
     </xs:complexType> 
    </xs:element> 
</xs:schema> 

Questo dovrebbe rispondi alla tua seconda domanda.

Per quanto riguarda la prima domanda, non penso che la convalida dell'ordine sia possibile. Tuttavia, è possibile utilizzare XSLT per ordinare il documento XML.

----- aggiunto la risposta alla prima domanda -----

Grazie, Michael Kay. Bene ... ecco la risposta alla tua prima domanda.

<?xml version="1.0" encoding="UTF-8"?> 
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
    <xs:element name="Transactions"> 
     <xs:complexType> 
      <xs:sequence> 
       <xs:element name="Transaction" maxOccurs="unbounded"> 
        <xs:complexType mixed="true"> 
         <xs:attribute name="OrderID" type="xs:integer"/> 
         <xs:assert test="empty(index-of((8,9,10),@OrderID))"/> 
        </xs:complexType> 
       </xs:element> 
      </xs:sequence> 
      <xs:assert test="every $x in Transaction satisfies 
          (empty($x/preceding-sibling::*) or 
          ($x/@OrderID gt $x/preceding-sibling::*[1]/@OrderID))"/> 
     </xs:complexType> 
    </xs:element> 
</xs:schema> 
+2

Sì, la convalida dell'ordine è possibile. Ad esempio '' –

+0

Grazie Chong Lip Phang. Onestamente, non capisco la tua risposta abbastanza bene da sapere se risolve il mio problema o no. Quando hai scritto presumibilmente l'8,9,10 si riferisce a specifici valori di OrderID? Il file su cui sto lavorando ha circa 30.000 transazioni al suo interno. Qualsiasi metodo che funzioni per me dovrebbe funzionare senza riferimento a valori specifici per OrderID. Il secondo test Selecter

+0

Sì, causerebbe il fallimento della convalida se il valore di OrderID è 8,9 o 10. Se i dati XML sono molto, quindi probabilmente hai bisogno di una regola per abbinare un modello specifico. La convalida passerà comunque se si omette questa regola di asserzione e OrderID salta 8,9 o 10. –