2009-01-23 5 views
1

J'ai assez gros fichiers XML d'entrée qui doivent être convertis dans un format donné avec XSL. Ces fichiers XSL ont été créés à la main, et nous voulons nous assurer que chaque nœud de texte non vide dans le document original est pris en compte, c'est-à-dire soit en valeur, en copie, soit en lecture et en concaténation avec autre chose.Puis-je savoir quelle quantité d'un document XML est traitée par une transformation XSL?

Est-ce encore possible? C'est-à-dire, est-il possible de savoir à quel point un document d'entrée est "couvert" par une transformation XSL?

Répondre

2

La réponse générale est négative.

aussi généralement impossible est la mise en œuvre de l'idée moins ambitieuse de trouver tous les nœuds de texte auquel aucun modèle a été apparié lors de l'exécution. Cela est dû au fait que même si des modèles correspondants sont définis, ils ne peuvent être sélectionnés pour le traitement que comme résultat d'un <xsl:apply-templates> avec un attribut "select" qui sélectionne les nœuds de texte spécifiques.

Il est généralement impossible d'analyser si cela est effectué pendant l'exécution.

Il est également impossible en général d'analyser chaque expression XPath utilisée dans le select attribut de <xsl:value-of/> et de <xsl:copy-of>, parce qu'une telle expression peut contenir une variable xsl et nous devons connaître le contenu d'exécution de cette variable dans l'ordre pour déterminer quels noeuds seront sélectionnés.

0

Vous pouvez extraire tout le texte du fichier Xml d'origine, puis rechercher si ces chaînes se trouvent dans le document résultant. Ce n'est pas une preuve que tout a vraiment été converti, mais vous pourriez trouver des parties manifestement manquantes.

+0

Oui, mais mon problème est que du texte peut être converti, par ex. les champs de date peuvent être convertis d'une locale à l'autre. – lindelof

+0

Je craignais que ce ne soit le cas ... – sth

1

Le meilleur que je peux trouver est maintenant d'ajouter quelque chose comme ça à la fin de votre xsl:

<xsl:template match="text()[normalize-space()]"> 
    To battle stations! 
    This sneaky tag tried to escape: <xsl:value-of select="name(..)"/> 
</xsl:template> 

Mais cela dépend vraiment de <xsl:apply-templates/> être appelé dans tous les bons endroits et ne sera probablement pas le faire pour les feuilles de style non-trivial ...

+0

Malheureusement, la technique décrite n'est utile que pour capturer des nœuds de texte non appariés. Un nœud de texte peut ne correspondre à aucun modèle mais il peut toujours être accédé/copié par le code d'autres modèles. De l'autre côté, même si un nœud de texte est identifié par un modèle, il ne peut toujours pas être copié! –

+0

Remarque, je ne vous ai pas downvoted :) –

0

La seule façon que j'ai fait ceci ceci dans le passé est en passant par le XSL avec un produit comme Altova's XMLSpy. C'est très fastidieux pour les grands documents XSL et XML bien sûr, mais il est parfois nécessaire de savoir ce qui se passe avec les transformations.

Questions connexes