2010-09-21 2 views
0

J'ai deux fichiers XML pour rendre une page dans XSLT. C'est parce que j'ai séparer la langue à partir des données pour un site Web multilingue. J'ai besoin de relier les données de l'un et de l'autre pour imprimer une valeur.Fusion de clés dans deux fichiers XML différents (séparation des données du langage)

Mon index.xml:

<?xml version="1.0" encoding="utf-8"?> 
<index> 
    <language>en</language> 

    <example> 
     <category id="1"> 
      <href>/category/id/1</href> 
     </category> 
     <category id="2"> 
      <href>/category/id/2</href> 
     </category> 
    </example> 
</index> 

J'ai un base.en.xml qui ressemble à:

<?xml version="1.0" encoding="utf-8"?> 
<language> 
    <category id="1">Category 1</category> 
    <category id="2">Category 2</category> 
</language> 

Mon incomplète index.xsl:

<?xml version="1.0" encoding="utf-8"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:param name="language" select="document('index.en.xml'))" /> 

    <xsl:template match="/"> 
     <html> 
      <head> 
       <title>Example</title>  
      </head> 

      <body> 
       <ul> 
        <xsl:apply-templates select="index/example/category" /> 
       </ul> 
      </body> 
     </html> 
    </xsl:template> 

    <xsl:template match="index/example/category"> 
     <a href="{href}"></a> 
    </xsl:template> 

</xsl:stylesheet> 

Enfin, la sortie souhaitée:

<html> 
    <head> 
     <title>Example</title> 
    </head> 

    <body> 
     <ul> 
      <li><a href="/category/id/1">Category 1</a></li> 
      <li><a href="/category/id/2">Category 2</a></li> 
     </ul> 
    </body> 
</html> 

Merci d'avance!

+0

La prochaine fois, il serait utile de préciser ce que les résultats sont à ce jour, ou en d'autres termes, ce qui manque. Est-ce que la feuille de style compile ou donne une erreur? Avez-vous implémenté X mais ne savez pas comment faire Y? – LarsH

Répondre

2

Votre appel de fonction document() dans le xsl:param avait un extra ")" qui cassait votre XSLT. Une fois cela résolu, vous pouvez exécuter des expressions XPATH par rapport au paramètre language.

$language/language/category[current()/@[email protected]]

A l'intérieur de votre modèle index/example/category, current() fait référence à l'élément index/example/category actuellement adapté. Le filtre de prédicat utilise @id pour sélectionner l'élément /language/category correct.

<?xml version="1.0" encoding="utf-8"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output indent="yes" /> 

    <xsl:param name="language" select="document('index.en.xml')" /> 

    <xsl:template match="/"> 
     <html> 
      <head> 
       <title>Example</title> 
      </head> 

      <body> 
       <ul> 
        <xsl:apply-templates select="index/example/category" /> 
       </ul> 
      </body> 
     </html> 
    </xsl:template> 

    <xsl:template match="index/example/category"> 
     <a href="{href}"><xsl:value-of select="$language/language/category[current()/@[email protected]]"/></a> 
    </xsl:template> 

</xsl:stylesheet> 
+1

Merci! Ça fonctionne bien! Une question: pourquoi utilisez-vous indent = "yes"? Edit: merci pour la bonne explication! – ipalaus

+0

Vous pouvez le retirer. Je l'ajoute généralement quand je teste mes transformations pour rendre la sortie plus facile à lire. Il ajoute un "ballonnement" supplémentaire (taille du fichier, longueur), donc vous ne voudrez peut-être pas le mettre à oui sur un système de production. –

Questions connexes