2009-02-24 6 views
2

J'ai un problème particulier Je ne suis pas sûr de la façon d'aborder. Ici, au bureau, il y a ce grand XSLT encombrant que nous avons pour adapter un type de XML à un autre. Le problème est que ce n'est pas écrit de façon très cohérente et très difficile à suivre. Dans l'ancienne création de cette feuille de style, il semble qu'on ait oublié exactement ce qu'elle fait.Algorithme de mappage XSLT

Existe-t-il un moyen de tracer facilement dans un format lisible par l'homme exactement ce que fait le géant XSLT? c'est-à-dire toutes les entrées possibles -> toutes les sorties possibles. Nous ne pouvons pas créer un document d'entrée global, car l'adaptateur a un comportement différent pour différentes entrées (nous estimons qu'il faudrait plus de 100 documents d'entrée pour couvrir toutes les sorties possibles)

Toute suggestion serait la bienvenue.

+0

Pas vraiment. XSLT est récursif dans la nature. – annakata

+0

Pas de plaisir. Je suppose que nous nous demandons vraiment: "Y at-il un moyen facile de tracer tous les appels de modèle pour une feuille de style géante?" XSLT ne s'y prête pas très bien. –

Répondre

1

Brisez-le - déplacez les instructions d'exécution xsl vers des modèles xsl dans le document. En faisant cela, vous allez travailler à une compréhension plus raisonnable du document de haut en bas.Et si c'est si incroyablement gigantesque que cela vous empêche de le comprendre, c'est comme si vous aviez une décision de ré-affacturage devant vous: ce document est-il si important que nous avons besoin de savoir ce qu'il fait (et de comprendre comment fonctionne-t-il, ce qui nécessite un remaniement), ou pouvons-nous vivre avec tel quel?

0

Cela ne va pas vous aider en toute probabilité. Mais je partagerai mon expérience. Je ne me suis traité à XSLT qu'environ hier quand j'ai eu le même problème en essayant de comprendre ce que la spécification XSLT disait w.r.t. analyse syntaxique. Ce que j'ai fait, pour m'aider, a été d'ajouter quelques fonctions (xsl: template, être pédant) au XSL original. Ensuite, je l'ai couru à travers le navigateur, et voilà, j'avais une image claire de la DFS.

J'ai créé les éléments suivants:

<xsl:template name="print"> 
<xsl:param name="message"/> 
<xsl:param name="elem"/> 
<div class="ArticleBody"> 
    <br/> 
    <xsl:value-of select="$message"/>: <xsl:value-of select="$elem"/> ... <br/> 
</div> 

Le modèle print est le modèle et le prologue et l'épilogue appellent simplement print avec des chaînes personnalisées.

Et je mets modifie le fichier XSL d'origine à partir de:

<xsl:template match="db:para"> 
<xsl:apply-templates/> 
</xsl:template> 

à:

<xsl:template match="db:para"> 
<xsl:call-template name="prologue"> 
    <xsl:with-param name="item" select="'para'"/> 
</xsl:call-template> 
<xsl:apply-templates/> 
<xsl:call-template name="epilogue"> 
    <xsl:with-param name="item" select="'para'"/> 
</xsl:call-template> 

je maintenant obtenir une sortie où chaque noeud a été traité:

start-processing: article ... 

et quand co mpleted

end-processing: article ... 

j'ai jeté un peu de CSS et (lors du traitement du nœud racine) juste pour que les choses semblent bonnes. Et ce genre de fait ma journée :)

1

Comprenez-vous vos documents d'entrée?

Si oui sauter la phrase suivante autre No: -

vous ne pouvez pas tester tout donc re-facteur de XSLT résultant vous avez besoin de faire la réponse à cette question, oui.

Comprenez-vous vos documents de sortie?

Si oui sauter la phrase suivante autre No: -

vous ne pouvez pas tester un nouveau facteur de XSLT résultant d'où vous avez besoin de faire la réponse à cette quesion, Oui.

Maintenant que les réponses aux deux questions sont Oui, abandonnez XSLT et construisez quelque chose que vous pouvez comprendre. Vous savez ce que l'entrée est et vous savez quelle sortie vous voulez, classique von-newman (enseignent-ils encore que ces jours-ci?).

+0

Je suis d'accord, je souhaite que le concepteur de cet adaptateur aurait partagé une meilleure documentation. –

1

Généralement c'est une tâche impossible - pour n'importe quel langage de programmation!

Ceci résulte de l'indécidabilité de the halting problem. Par conséquent, vous pouvez faire d'énormes efforts pour essayer de faire quelque chose qui s'avère impossible.

Ma recommandationest d'écrire votre propre solution, suivant les meilleures pratiques de programmation, en utilisant des tests unitaires et si les preuves de correction possibles. XSLT en tant que langage fonctionnel est mieux adapté pour prouver l'exactitude.

+0

Merci d'avoir signalé cela. Ceci est très proche d'un problème d'arrêt et explique pourquoi cela semble si difficile. :-) –

+0

Ce n'est pas toujours possible, mais cela peut être possible pour un programme spécifique. par exemple. Bonjour le monde. Une correspondance récursive entre les grammaires peut également être spécifiée (mais ce n'est pas pour les faibles de cœur sans arrière-plan mathématique - et donc pas très lisible par l'homme). – 13ren