2009-05-12 9 views
0

J'ai cherché autour et trouvé quelques tutoriels pour la fonction de xsl: key et key(), mais de toute façon je manque toujours une certaine compréhension apparemment.Table de recherche externe XSLT Utilisation correcte - key() function?

Il y a une transformation XML-XML que je dois faire, qui comprend 10 champs où je dois prendre des valeurs de chaîne de source XML, trouver les codes numériques appropriés des tables de recherche appropriées (fournies), et mettre ces codes dans XML résultant.

J'ai une version de travail de ce faire xsl: for-each pour la table de recherche, mais je soupçonne qu'il est sous-optimal et aimerait savoir si j'aurais dû utiliser select = "key ('CR-Lookup', $ CR) "au lieu de ça.

Alors, ce que je veux faire est (partie profonde de l'arbre):

<Contributor> 
<ContributorRole>producer</ContributorRole> 
<ContributorName>Anglet, J.</ContributorName> 
</Contributor> 

à transformer en quelque chose comme ceci:

<Contributor> 
<ContributorRole id="7" code="818"/> 
<Value id="Name">Anglet, J.</Value> 
</Contributor> 

Les fichiers que j'ai fait comme ainsi:

fichier table Recherche lookup_ContributorRole.xml:

<lookup id="ContributorRole"> 
<row> 
    <id>7</id> 
    <parentid>NULL</parentid> 
    <valueMember>1</valueMember> 
    <displayMember>producer</displayMember> 
    <code>818</code> 
    <externalId>NULL</externalId> 
    <description>NULL</description> 
</row> 
<!-- more <row>s...--> 
</lookup> 

Amd le fichier XSLT , où je tente de faire la mise en correspondance:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:foxml="info:fedora/fedora-system:def/foxml#" 
    xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" 
    xmlns:rel="info:fedora/fedora-system:def/relations-external#" 
    xmlns:oai_dc="http://www.openarchives.org/OAI/2.0/oai_dc/" 
    xmlns:dc="http://purl.org/dc/elements/1.1/" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema" 
    xmlns:audit="info:fedora/fedora-system:def/audit#" 
    xmlns:fedoraxsi="http://www.w3.org/2001/XMLSchema-instance" 

    exclude-result-prefixes="xsl foxml rdf rel oai_dc dc xsi audit fedoraxsi" 
> 
<xsl:output omit-xml-declaration="yes" indent="yes" method="xml" /> 

<xsl:key name="CR-lookup" match="row" use="displayMember"/> 
<xsl:variable name="CRTable" select="document('lookup_ContributorRole.xml')/lookup/row"/> 

<xsl:template match="Contributor"> 
    <Contributor> 
    <xsl:variable name="CR"><xsl:value-of select="ContributorRole"/></xsl:variable> 
    <ContributorRole> 
    <xsl:for-each select="$CRTable"> 
     <xsl:if test="displayMember=$CR"> 
      <xsl:attribute name="id"><xsl:value-of select="id"/></xsl:attribute> 
      <xsl:attribute name="code"><xsl:value-of select="code"/></xsl:attribute> 
     </xsl:if> 
    </xsl:for-each> 
    </ContributorRole> 
    <Value id="Name"><xsl:value-of select="ContributorName"/></Value> 
    </Contributor> 
</xsl:template> 

    <xsl:template match="/"> 
    <DigitalObject> 
     <Core> 
      <xsl:for-each select="/foxml:digitalObject/foxml:datastream[@ID='DigitalObjectLL']/foxml:datastreamVersion"> 
      <xsl:sort select="@CREATED" order="descending"/> 
      <xsl:if test="position() = 1"> 
       <xsl:for-each select="./foxml:xmlContent/lnbdo"> 
        <xsl:apply-templates select="Contributor"/> 
       </xsl:for-each> 
      </xsl:if> 
      </xsl:for-each> 
     </Core> 
    </DigitalObject> 
    </xsl:template> 
</xsl:stylesheet> 

Répondre

4

Vous avez passer le document de contexte avant de pouvoir utiliser la clé:

<xsl:variable name="CRTable" select="document('lookup_ContributorRole.xml')"/> 

<xsl:template match="Contributor"> 
    <Contributor> 
    <xsl:variable name="CR" select="ContributorRole"/> 
    <ContributorRole> 
     <xsl:for-each select="$CRTable"><!-- change context document --> 
     <xsl:for-each select="key('CR-lookup', $CR)"> 
      <xsl:attribute name="id"><xsl:value-of select="id"/></xsl:attribute> 
      <xsl:attribute name="code"><xsl:value-of select="code"/></xsl:attribute> 
      ... 

Avec XSLT 2.0 vous pourrait faire

<xsl:for-each select="key('CR-lookup', $CR, $CRTable)"> 
+0

aha, merci. mais cela signifie toujours que je dois utiliser le premier $ CRTable for-each, donc je me demande s'il y a vraiment une différence entre le 2nd for-each (avec select = "key (...)") et xsl: if à la place (ce que j'ai fait). – Gnudiff

+0

Je pense que vous avez mal compris le code. J'ai mis à jour la réponse pour refléter que vous n'avez pas besoin d'un xsl: si avec la clé. – jelovirt

+0

Oh, je vois maintenant, merci! – Gnudiff

Questions connexes