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>
3 Réponses :
La condition doit être sur XSL: apply-modèles au lieu de XSL: modèle: dans votre solution, vous transformez tous les nœuds 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
@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"?
Cette feuille de style: sortie: p>
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
<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>
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
@Dimitre: Je ne suis pas allé avec deux touches car cette expression "* / lire [générale-id () ...] code> itérale sur tous les éléments code> code> .
@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 ...
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 :)