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.

Ce XSLT compilateur que vous utilisez?
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