XSLT 2.0 Externe de la recherche à l'aide de la touche() et document()
Je suis en tirant ce qu'il reste de mes cheveux à essayer d'obtenir une simple recherche externe de travail à l'aide de Saxon 9.1.0.7.
J'ai un simple fichier source dummy.xml:
<something>
<monkey>
<genrecode>AAA</genrecode>
</monkey>
<monkey>
<genrecode>BBB</genrecode>
</monkey>
<monkey>
<genrecode>ZZZ</genrecode>
</monkey>
<monkey>
<genrecode>ZER</genrecode>
</monkey>
</something>
Puis la recherche de fichier est GenreSet_124.xml:
<GetGenreMappingObjectsResponse>
<tuple>
<old>
<GenreMapping DepartmentCode="AAA"
DepartmentName="AND - NEWS AND CURRENT AFFAIRS"
Genre="10 - NEWS"/>
</old>
</tuple>
<tuple>
<old>
<GenreMapping DepartmentCode="BBB"
DepartmentName="AND - NEWS AND CURRENT AFFAIRS"
Genre="11 - NEWS"/>
</old>
</tuple>
... lots more
</GetGenreMappingObjectsResponse>
Ce que je suis en train de réaliser est tout simplement mettre la main sur le "Genre" de la valeur fondée sur le "DepartmentCode" de la valeur.
Donc mon XSL ressemble:
...
<!-- Set up the genre lookup key -->
<xsl:key name="genre-lookup" match="GenreMapping" use="@DepartmentCode"/>
<xsl:variable name="lookupDoc" select="document('GenreSet_124.xml')"/>
<xsl:template match="/something">
<stuff>
<xsl:for-each select="monkey">
<Genre>
<xsl:apply-templates select="$lookupDoc">
<xsl:with-param name="curr-label" select="genrecode"/>
</xsl:apply-templates>
</Genre>
</xsl:for-each>
</stuff>
</xsl:template>
<xsl:template match="GetGenreMappingObjectsResponse">
<xsl:param name="curr-genrecode"/>
<xsl:value-of select="key('genre-lookup', $curr-genrecode)/@Genre"/>
</xsl:template>
...
Le problème que j'ai est que je ne reçois rien en retour. Actuellement, je viens d'obtenir
<?xml version="1.0" encoding="UTF-8"?>
<stuff>
<Genre/>
<Genre/>
<Genre/>
<Genre/>
</stuff>
J'ai déplacé toutes les données de recherche pour avoir les attributs de GenreMapping, précédemment en tant qu'éléments d'enfant de GenreMapping chaque fois que je suis entré dans le template match="GetGenreMappingObjectsResponse" il serait juste d'imprimer tout le texte de chaque GenreMapping (DepartmentCode, Nomduservice, Genre)!
Je ne peux pas pour la vie de me comprendre ce que je fais de mal. Tout helpo/suggestions seraient grandement appréciés.
S'il vous plaît trouver l'actuelle XSLT inscription:
<?xml version="1.0"?>
<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema">
<!-- Define the global parameters -->
<xsl:param name="TransformationID"/>
<xsl:param name="TransformationType"/>
<!-- Specify that XML is the desired output type -->
<xsl:output method="xml" encoding="UTF-8" indent="yes"/>
<!-- Set up the genre matching capability -->
<xsl:key name="genre-lookup" match="GenreMapping" use="@DepartmentCode"/>
<xsl:variable name="documentPath"><xsl:value-of select="concat('GenreSet_',$TransformationID,'.xml')"/></xsl:variable>
<xsl:variable name="lookupDoc" select="document($documentPath)"/>
<!-- Start the first match on the Root level -->
<xsl:template match="/something">
<stuff>
<xsl:for-each select="monkey">
<Genre>
<xsl:apply-templates select="$lookupDoc/*">
<xsl:with-param name="curr-genrecode" select="string(genrecode)"/>
</xsl:apply-templates>
</Genre>
</xsl:for-each>
</stuff>
</xsl:template >
<xsl:template match="GetGenreMappingObjectsResponse">
<xsl:param name="curr-genrecode"/>
<xsl:value-of select="key('genre-lookup', $curr-genrecode, $lookupDoc)/@Genre"/>
</xsl:template>
</xsl:stylesheet>
La TransformationID est toujours 124 (donc la bonne recherche de fichier est ouvert. Le Type est juste un nom que je ne suis actuellement pas à l'aide, mais le vouloir.
Saxon-B 9.1.0.7
Les Figures. Je ne suis pas familier avec celui-là. Peut-être plus tard Tomalak viendra autour, et vous aider. A la clef méthode a fonctionné?
Salut, il a essayé, pas de chance, juste un espace. Merci pour tous vos efforts.
Bien, vous devriez prendre un peu de recul, je pense, et assurez-vous que tout est de se comporter de la façon dont vous pensez qu'elle est. Remplacer le
value-of
avec quelque chose que juste sorties de la valeur de $curr-genrecode
vous assurer que c'est remplie de droit. Et puis continuer à ajouter plus de complexité revenir jusqu'à ce qu'il cesse de travailler. Vous serez en mesure de réduire, au moins, et puis je vais peut-être pouvoir l'aider un peu plus.OriginalL'auteur | 2009-08-14
Vous devez vous connecter pour publier un commentaire.
Dans XSLT 2.0, il y a deux façons dont vous pouvez faire ce que vous voulez:
On est les trois paramètres de la version de la
key
fonction. Le troisième paramètre permet de spécifier le nœud racine vous voulez la clé (par défaut c'est toujours la racine du document principal):Une autre méthode consiste à utiliser le
key
fonction en vertu de la$lookupDoc
nœud:Ces deux méthodes sont décrites dans la XSLT 2.0 des spécifications sur les touches, et ne fonctionne pas en XSLT 1.0.
Par souci d'exhaustivité, il vous faudrait réécrire ce de ne pas utiliser les touches si vous êtes limité à XSLT 1.0.
Aha! Le problème est le
select="$lookupDoc"
dans votreapply-templates
appel est d'appeler un modèle par défaut plutôt que de celui que vous attendez, de sorte que le paramètre est de se perdre.Changer à cela:
Qui appellera votre modèle correctement et la clé devrait fonctionner.
Donc la dernière feuille XSLT devrait ressembler à quelque chose comme ceci:
(Source de l'information)
Cela pourrait être un problème spécifique avec votre XSLT compilateur, mais à l'aide de
$lookupDoc/*
devrait couvrir vos bases.Bonjour à nouveau, en Utilisant le code mis à jour je n'ai plus d'obtenir des éléments vides je les reçois plein d'espaces (24 lignes). Je suis vraiment perplexe.
Est-il plus votre XML que votre exemple ne le laisse?
Aussi, avez-vous essayé la clé?
OriginalL'auteur Welbog
OK, donc c'est un peu mentale et je ne prétends pas comprendre, mais il fonctionne (on dirait une carrière dans le logiciel).
Le problème j'ai eu, c'est que lorsque j'appelle l'apply-templates et passer dans le document externe comme une variable il jamais égalée les modèles, même ceux appelés "Genremapping".
J'ai donc utilisé un joker pour l'attraper, également lors de l'appel de l'apply-templates j'ai rétréci vers le bas l'ensemble de nœuds à l'enfant que j'étais intéressé. C'était assez dingue un j'ai pu imprimer le nom du nœud et de voir "GenreMapping" pourtant, il n'est jamais allé dans n'importe quel modèle je l'avais appelé "GenreMapping" au contraire, en choisissant de ne jamais aller à "*" modèle.
Ce que cela signifie, c'est que mon nouveau template match est appelée pour chaque GenreMapping nœud n'est donc peut-être un peu inefficace. Ce que je réalise est tout ce que je devais faire était d'impression sometihng si un prédicat de correspondance.
De sorte qu'il ressemble à ça maintenant (pas de clé utilisé que ce soit):
Tous de sortie:
Remarque, la dernière key_value correctement ne dispose pas d'une entrée de code comme il n'y a pas de correspondance dans le document de recherche.
Réponse sur un code postal. Merci pour l'aide Welbog.
OriginalL'auteur