Domanda

Sto creando regolarmente uno schema XSD trasformando un modello di dati proprietario di un sistema legacy. Questo funziona abbastanza bene. Tuttavia, il sistema legacy mi consente solo di specificare attributi di base di un parametro, come il tipo di dati (int, string ecc.).

Vorrei migliorare la trasformazione XSL con un meccanismo che mi consente di aggiungere metadati al fine di fornire maggiori dettagli per la trasformazione. Ho pensato a qualcosa come la notazione delle proprietà Java per assegnare attributi a un XPath.

Immagina il seguente esempio:

modello di dati di sistema legacy (in realtà così pulito, ma più adatto a scopi dimostrativi)

<datamodel>
  <customer>
    <firstName type="string"/>
    <lastName type="string"/>
    <age type="int">
  <customer>
</datamodel>

metadati

customer/firstName/@nillable=false
customer/lastName/@nillable=false
customer/age/@nillable=true
customer/firstName/@minOccurs=1
customer/firstName/@maxOccurs=1
customer/lastName/@minOccurs=1
customer/lastName/@maxOccurs=1

schema XSD risultante

...
<xs:complexType name="customerType">
  <xs:sequence>
    <xs:element name="firstName" type="xs:string" nillable="false" minOccurs="1" maxOccurs="1"/>
    <xs:element name="lastName" type="xs:string" nillable="false" minOccurs="1" maxOccurs="1"/>
    <xs:element name="age" type="xs:int" nillable="true"/>
  </xs:sequence>
</xs:complexType>
...

Cosa ne pensi? C'è un modo per includere i metadati in un foglio di stile XSL?

È stato utile?

Soluzione

La soluzione migliore sarebbe quella di modificare i dati legacy aggiungendo i metadati mancanti.

Un'istanza del modello di dati modificato "quot" " il vocabolario può essere qualcosa del genere:

<datamodel xmlns:nm="my:new.meta">
    <customer>
        <firstName type="string"
                   nm:nillable="false"
                   nm:minOccurs="1"
                   nm:maxOccurs="1"
                   />
        <lastName type="string"
                  nm:nillable="false"
                  nm:minOccurs="1"
                  nm:maxOccurs="1"
                  />
        <age type="int" nm:nillable="true"/>
    </customer>
</datamodel>

Mettere le nuove proprietà in uno spazio dei nomi separato è un buon modo per distinguerle facilmente dalle proprietà già supportate. Di solito non è consigliabile usare gli attributi in uno spazio dei nomi, quindi se questo deve essere evitato, si potrebbero usare sotto-elementi (appartenenti al nuovo spazio dei nomi) invece degli attributi. Se i nuovi attributi appartengono a uno spazio dei nomi diverso, la convalida dello schema legacy potrebbe non essere respinta.

Se per alcuni motivi non è possibile modificare i dati legacy, consiglierei di non includere le nuove proprietà nel foglio di stile XSLT stesso (ciò è perfettamente possibile, ad esempio definendolo come il contenuto di un < code> < xsl: variabile > ), ma per fornire queste nuove proprietà come file XML separato o come set di uno o più file XML.

È possibile accedere in modo dinamico a qualsiasi file XML durante una trasformazione XSLT utilizzando la funzione document () XSLT. Un'istanza del file XML con le nuove proprietà può apparire così:

<newProperties xmlns:nm="my:new.meta">
    <customer>
        <firstName nm:nillable="false"
                   nm:minOccurs="1"
                   nm:maxOccurs="1"
                   />
        <lastName nm:nillable="false"
                  nm:minOccurs="1"
                  nm:maxOccurs="1"
                  />
        <age nm:nillable="true"/>
    </customer>
</newProperties>

Spero che questo abbia aiutato.

Saluti,

Dimitre Novatchev

Altri suggerimenti

" Cosa ne pensi? "

Due Tre cose.

  1. Correggi i metadati legacy. È XML. Aggiungi cose ad esso. Aggiungi uno spazio dei nomi, se necessario.

  2. Se non riesci a correggere i metadati legacy, chi manterrà il secondo set di metadati che non è in notazione XML? Chi farà il doppio ingresso per modificare i metadati? Quali sono le probabilità che qualcuno segua?

  3. Prendi in considerazione l'utilizzo di XML per i metadati aggiuntivi, non di pseudo-XPath. La coerenza aiuterà coloro che verranno dopo aver capito cosa sta succedendo.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top