2010-02-22 6 views
0

Je souhaite copier la majeure partie du code XML en l'état, à l'exception de quelques noeuds qui dépendent de la société qui sera transmise à la feuille de style. Si j'utilise un modèle d'identité et que je veux seulement que quelque chose se produise si une variable globale est égale à une valeur spécifique, comment puis-je y arriver puisque vous ne pouvez pas mettre une vérification dans la correspondance entre [] ... au moins dans 1.0? Donc, dans l'exemple ci-dessous, je veux seulement échanger le nom de la société lorsque la variable est égale à une certaine valeur comme 'DEF Company'. La variable 'company' ne fera pas partie du XML.Modèles conditionnels basés sur la variable globale

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

<!-- Dummy example variable -->
<xsl:variable name="company"><xsl:text>DEF Company</xsl:text></xsl:variable>

<xsl:template match="node() | @*"> 
    <xsl:copy> 
     <xsl:apply-templates select="@* | node()"/> 
    </xsl:copy> 
</xsl:template> 

<xsl:template match="Company"> 
    <xsl:copy> 
     <xsl:text>ABC Company</xsl:text> 
    </xsl:copy> 
</xsl:template> 

</xsl:stylesheet>

Répondre

0

J'utilise [] avec correspondance de modèle et d'un moteur XSLT version 1.0 (Xalan).

Par exemple:

<xsl:template match="@*|node()[name() !='a']"> 
+0

Je souhaite uniquement exécuter le modèle suivant si la variable globale 'company' est égale à 'DEF Company'. De plus, la valeur de la variable globale sera transmise via un convertisseur. '' – johkar

3

Eh bien, vous pouvez vérifier dans le match. Ce n'est peut-être pas le plus élégant, mais ça devrait marcher.

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> 
    <xsl:param name="company" select="'DEF Company'"/> 

    <xsl:template match="node() | @*"> 
     <xsl:copy> 
      <xsl:apply-templates select="@* | node()" /> 
     </xsl:copy> 
    </xsl:template> 

    <xsl:template match="Company"> 
     <xsl:copy> 
      <xsl:choose> 
       <xsl:when test="$company = 'DEF Company'"> 
        <xsl:text>ABC Company</xsl:text> 
       </xsl:when> 
       <xsl:otherwise> 
        <xsl:apply-templates select="@* | node()" /> 
       </xsl:otherwise> 
      </xsl:choose> 
     </xsl:copy> 
    </xsl:template> 
</xsl:stylesheet> 
+0

+1 c'est exactement ce que j'avais prêt quelques secondes après vous. :) – Tomalak

+0

$ company = 'Compagnie DEF' est faux. Je pense que vous voulez dire. = $ company;) – Erlock

+0

J'interprétais la question comme étant que si le paramètre passé dans la feuille de style correspondait à une valeur, remplacer le texte d'un élément. Si l'on voulait faire correspondre le paramètre à la valeur de l'entrée, alors oui, vous voudriez vérifier avec. = $ compagnie. Au moment de la relecture, je ne sais pas très bien lequel de ceux que le questionneur voulait faire. –

1

Je préfère utiliser un élément intégré dans la feuille de style à cet effet:

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:my="my-own-namespace"> 
    <my:company match="DEF Company" replace="ABC Company" /> 
    <xsl:template match="Company[.=document('')/*/my:company/@match]"> 
     <xsl:copy> 
      <xsl:value-of select="document('')/*/my:company/@replace" /> 
     </xsl:copy> 
    </xsl:template> 
    <xsl:template match="@*|node()"> 
     <xsl:copy> 
      <xsl:apply-templates select="@*"/> 
      <xsl:apply-templates/> 
     </xsl:copy> 
    </xsl:template> 
</xsl:stylesheet> 
fonction

document() avec un paramètre de chaîne vide fait référence à lui-même la racine de la feuille de style.