2008-09-22 8 views
0

Supposons que nous ayons une feuille de style qui extrait des métadonnées à l'aide de la fonction key(). En d'autres termes, nous avons exemple des documents comme celui-ci:Pouvez-vous utiliser key/keyref au lieu de restriction/énumération dans le schéma XML?

<items> 

<item type="some_type"/> 

<item type="another_type"/> 

</items> 

et une table de données supplémentaires nous aimerions associer aux éléments pendant le traitement:

<item-meta> 

<item type="some_type" meta="foo"/> 

<item type="another_type" meta="bar"/> 

<item type="yet_another_type" meta="baz"/> 

</item-meta> 

Enfin, supposons que nous voulons faire la validation de schéma le document d'instance, en restreignant les attributs de type à l'ensemble des types qui se produisent dans item-meta. Donc, dans le schéma, nous voulons utiliser key/keyref au lieu de restriction/énumération. En effet, l'utilisation de restriction/énumération nécessite de créer une liste séparée d'attributs de type valides. Cependant, il ne semble pas que key/keyref fonctionne réellement. Après l'avoir essayé (avec MSXML 6.0), il semble que le sélecteur d'une clé de schéma n'accepte pas la fonction document() dans son argument xpath, donc nous ne pouvons pas examiner les méta-données, qu'elles apparaissent dans un fichier externe ou dans le fichier de schéma lui-même. Il semble que le seul endroit où nous pouvons chercher des clés est le document d'instance. Donc, si nous ne voulons vraiment pas avoir une liste séparée de types valides, nous devons faire une transformation de pré-validation, en tirant le méta item-meta, puis faire la validation, puis faire notre transformation originale. Cela semble trop compliqué pour ce qui devrait être une utilisation relativement simple du schéma XML et des feuilles de style.

Y a-t-il un meilleur moyen?

Répondre

1

Les sélecteurs dans key/keyref n'autorisent qu'une syntaxe xpath très restreinte. Court, mais pas complètement précis: Le sélecteur doit pointer vers un sous-noeud de l'élément déclaré.

La définition complète de la syntaxe restreinte est -> here.

Donc, non, je ne vois pas une meilleure façon, désolé. BTW: Le W3C stipule que cette restriction a été faite pour faciliter la vie sur les implémenteurs de processeurs XML Schema. Gardez à l'esprit que l'un des objectifs de conception de XML Schema était de permettre le traitement d'un document en mode streaming. Cela explique vraiment beaucoup des restrictions parfois apparemment aléatoires de XML Schema.

0

Après y avoir réfléchi un peu plus, j'ai eu l'idée de faire faire à la feuille de style cette partie de la validation. Le schéma définirait le type d'élément en tant que chaîne simple, et la feuille de style émettrait un message et arrêterait le traitement s'il ne pouvait pas rechercher le type d'élément dans la table item-meta.

Cette solution résout le problème initial d'avoir à écrire plusieurs fois la liste des types valides, mais elle introduit le problème que la logique de validation est maintenant mélangée avec la logique de la feuille de style. Je n'ai pas assez d'expérience avec XSD + XSLT pour savoir si ce nouveau problème est moins sérieux que l'ancien, mais il semble être plus élégant que ce que j'ai écrit plus tôt sur l'extraction de la table item-meta dans chaque document d'instance dans un transformation de pré-validation.

0

Vous n'auriez pas besoin d'arrêter le XSLT avec une erreur. Il suffit de le laisser produire quelque chose que le schéma ne sera pas validé et que les points au problème d'origine comme

<error txt="Invalid-Item-Type 'invalid_type'"/> 

En dehors de cela s'il vous plaît garder à l'esprit qu'il n'y a pas de discussion ici discussions. Les messages peuvent monter et descendre, il est donc préférable de modifier votre question en conséquence.Rappelez-vous, la philosophie ici est «Une question, et la meilleure réponse gagne».