9
votes

Utilisation de modèles d'application XSLT sur des nœuds sélectionnés conditionnellement

Disons que j'ai un document XML comme ceci:

<?xml version="1.0"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes" />
        <xsl:template match="/director">
                <Plays>
                <xsl:apply-templates select="play"/>
                </Plays>
        </xsl:template>

        <xsl:template match="play[a='Will Smith']">
                <play title="{data(t)[1]}">
                <xsl:apply-templates select="a"/>
                </play>
        </xsl:template>

        <xsl:template match="a">
                <star>
                <xsl:value-of select="."/>
                </star>
        </xsl:template>
</xsl:stylesheet>


2 commentaires

Qu'est-ce que ce que vous avez fait jusqu'à présent une sortie?


Solution ci-dessous résolue ça ... merci de commenter au moins :)


3 Réponses :


10
votes

La condition doit être sur XSL: apply-modèles au lieu de XSL: modèle: xxx

dans votre solution, vous transformez tous les nœuds . Pour les nœuds de lecture correspondant à la condition, votre modèle est appliqué. Mais pour ceux qui ne correspondent pas à la condition, un modèle par défaut ("Identity Transform") est appliqué à la place.

Alternativement, vous pouvez conserver la condition sur XSL: Match de modèle, mais ajouter un autre modèle pour < Jouer> qui ne correspond pas à la condition, transformer ces en rien: xxx


3 commentaires

@Msencenb: Cela ne génère pas le résultat souhaité.


Es-tu sûr? Le premier exemple de code donné semble fonctionner pour moi


Aha! Vous venez de répondre à une question A avoir eu qu'aucun didacticiel que j'ai vu expliqué. Où puis-je trouver des informations sur ce "modèle par défaut"?



1
votes

Cette feuille de style: xxx

sortie: xxx


3 commentaires

Cela fonctionne bien aussi et utilise des clés comme une autre réponse. Je pense que la clé à emporter pour moi est que les conditions doivent être dans la section Sélectionner plutôt que la déclaration de match.


@Msencenb: Modèle correspondant à la correspondance vs. Select Driven est une question de style Pull VS Push. Les deux sont bons. Dans ce cas, parce que j'utilise un paramètre dans une feuille de style XSLT 1.0, je devais aller avec un style de poussée (les références param / var ne sont pas autorisées dans les modèles XSLT 1.0)


@Alejandro, @@ msencenb: Les références variables / paramètres sont autorisées dans le motif de correspondance dans XSLT 2.0



5
votes

i. Probablement la solution XSLT 1.0 la plus efficace forte>: xxx pré>

Lorsque cette transformation est appliquée sur le document XML fourni (FORT>: P>

<xsl:stylesheet version="2.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>

 <xsl:template match="/*">
  <Plays>
    <xsl:for-each-group select="play[a='Mel Gibson']"
          group-by="t">
      <xsl:apply-templates select="."/>
    </xsl:for-each-group>
  </Plays>
 </xsl:template>

 <xsl:template match="play">
  <Play title="{t}">
   <xsl:for-each-group select="../play[t = current()/t]/a"
        group-by=".">
     <xsl:apply-templates select="."/>
   </xsl:for-each-group>
  </Play>
 </xsl:template>

 <xsl:template match="a">
  <star>
    <xsl:value-of select="."/>
  </star>
 </xsl:template>
</xsl:stylesheet>


6 commentaires

Je n'avais jamais entendu parler de clés ... mais cela semble être le plus efficace. Merci


@Msencenb: Notez que la solution XSLT 2.0 n'utilise pas du tout des clés. Leur rôle est joué par . Mais bien sûr, même dans XSLT 2.0, cela ne fait pas mal, et peut être utile, de savoir comment utiliser les clés.


@Dimitre: Je ne suis pas allé avec deux touches car cette expression "* / lire [générale-id () ...] itérale sur tous les éléments .


@Alejandro: Vous avez peut-être raison. Cependant, s'il y a un traitement supplémentaire dans lequel cette clé pourrait être utile, vous gagnez clairement. Peut-être dans les versions futures de XSLT (3+), nous aurions les possibilités d'inspecter tous les éléments d'une clé intégrée donnée - alors un tel travertial supplémentaire ne sera pas nécessaire.


@Dimitre: Oui! J'ai vu cette discussion dans la liste XSLT. Pensez-vous que le Dr Kay fera cette proposition? Savez-vous si cela est déjà fait?


@Dimitre: Dans ce cas, vous pourriez avoir cette clé inverse: titre par acteur. Mais je pensais que ce serait trop d'optimisation ...