2008-11-11 21 views
1

Je crée régulièrement un schéma XSD en transformant un modèle de données propriétaire d'un système hérité. Cela fonctionne plutôt bien. Cependant, le système hérité ne me permet que de spécifier des attributs très basiques d'un paramètre, tels que le type de données (int, string etc.).Génération de métadonnées avec XSLT

Je voudrais améliorer la transformation XSL avec un mécanisme qui me permet d'ajouter des méta-données afin de fournir plus de détails pour la transformation. J'ai pensé à quelque chose comme la notation des propriétés Java pour assigner des attributs à un XPath.

Imaginez l'exemple suivant:

modèle de données de l'ancien système (en fait que propre, mais le mieux adapté à des fins de démonstration)

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

méta-données

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 

résultat XSD schéma

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

Que pensez-vous de cela? Existe-t-il un moyen d'inclure des métadonnées dans une feuille de style XSL?

Répondre

2

La meilleure solution serait de modifier les données héritées en ajoutant les métadonnées manquantes.

Une instance du vocabulaire modifié « de datamodel » peut-être quelque chose comme ceci:

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

Mettre les nouvelles propriétés dans un espace de noms distinct est une bonne façon de les distinguer facilement des propriétés déjà prises en charge. Habituellement, l'utilisation d'attributs dans un espace de noms n'est pas recommandée, donc si cela doit être évité, on pourrait utiliser des sous-éléments (appartenant au nouvel espace de noms) au lieu d'attributs. Si les nouveaux attributs appartiennent à un espace de noms différent, il se peut que la validation du schéma hérité ne les rejette pas.Si pour certaines raisons, il n'est pas possible de modifier les données héritées, je recommande de ne pas inclure les nouvelles propriétés dans la feuille de style XSLT elle-même (cela est parfaitement possible, par exemple en le définissant comme le contenu d'une <xsl:variable>), mais pour fournir ces nouvelles propriétés en tant que fichier XML distinct ou ensemble d'un ou plusieurs fichiers XML.

Un fichier XML peut être accédé dynamiquement au cours d'une transformation XSLT à l'aide de la fonction document XSLT(). Une instance du fichier XML avec les nouvelles propriétés peut ressembler à ceci:

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

Espérons que cela a aidé.

Cheers,

Dimitre Novatchev

1

"Que pensez-vous de cela?"

Deux Trois choses.

  1. Correction des métadonnées héritées. C'est XML. Ajoutez des choses à cela. Ajoutez un espace de noms si vous le devez.

  2. Si vous ne pouvez pas corriger les métadonnées héritées, qui maintiendra le second ensemble de métadonnées qui ne sont pas en notation XML? Qui fera la double entrée de faire un changement de métadonnées? Quelles sont les chances de quelqu'un qui suit? Envisagez d'utiliser XML pour les métadonnées supplémentaires, et non pseudo-XPath. La cohérence aidera ceux qui viendront après vous comprendre ce qui se passe.

+0

1) d'accord, pour être honnête: Le système existant est source fermé sans aucune chance de jouer avec le code de génération de modèle de données et non propre comme décrit ci-dessus. Cependant, c'est assez bon à des fins de démonstration. 2) Je suis conscient des inconvénients en matière de maintenance – poezn