Le problème, en général, lorsque les gens XSLT tentative est qu'ils pensent qu'il est une langue que tout autre, comme C#, Java, PHP. Toutes ces langues sont utilisées pour dire à l'ordinateur quoi faire. Mais avec XSLT c'est l'inverse, vous dites au processeur quelle sortie vous attendez en fonction des règles.
Parfois, l'utilisation de xsl:if
est bonne. Plus souvent, c'est un signe d'erreur. L'astuce pour supprimer nœuds, éléments ou texte est de créer un modèle correspondant qui ne génère rien. Quelque chose comme ceci:
<!-- starting point -->
<xsl:template match="/">
<xsl:apply-templates select="root/something" />
</xsl:template>
<xsl:template match="name-ad-size">
<!-- don't do anything, continue processing the rest of the document -->
<xsl:apply-templates select="node() | @*" />
</xsl:template>
<!-- copy anything else -->
<xsl:template match="node() | @*">
<xsl:copy>
<xsl:apply-templates select="node() | @*" />
</xsl:copy>
</xsl:template>
Pourquoi cela fonctionne-t-il? Simplement, parce que le processeur passe par chaque élément et noeud et regarde d'abord le meilleur modèle correspondant. La meilleure correspondance pour un noeud <name-ad-size>
est la correspondance qui ne génère aucun résultat, ce qui permet de le supprimer efficacement. Les autres nœuds ne correspondent pas et se retrouvent ainsi dans le modèle "catch all".
Remarque 1: l'erreur que vous recevez est probable parce que vous avez ajouté par erreur <xsl:template>
dans un autre élément. Il ne peut être placé sous la racine <xsl:stylesheet>
et nulle part ailleurs.
Remarque 2: l'ordre des instructions <xsl:template>
est sans importance. Le processeur utilisera chacun d'entre eux pour trouver la meilleure correspondance, peu importe où ils sont placés (tant qu'ils sont directement sous la racine).
EDIT: Quelqu'un a récupéré votre code comme par magie. Voici l'histoire ci-dessus appliquée à votre feuille de style complet:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:preserve-space elements="codeListing sampleOutput"/>
<!-- NOTE: it is better to have a starting point explicitly -->
<xsl:template match="/">
<xsl:apply-templates select="root/something" />
</xsl:template>
<!-- I assume now that you meant to delete the <Ad> elements -->
<xsl:template match="Ad">
<xsl:apply-templates select="node()|@*"/>
</xsl:template>
<!-- NOTE: here you were already deleting <phy-ad-width> and everything underneath it -->
<xsl:template match="phy-ad-width"/>
<!-- NOTE: copies everything that has no matching rule elsewhere -->
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
je fixe la mise en forme, mais votre XSL est invalide parce que vous ne pouvez pas mettre un '
@Jim: aha, j'ai seulement vu le 'xsl: if', donc j'ai deviné le reste du problème. Le reste était parti parce qu'il n'était pas dans un bloc de code. Ah, quoi qu'il en soit, la réponse devrait rester à peu près la même ;-) – Abel