2010-07-27 3 views
5
<xsl:apply-templates select="element[child='Yes']"> 

fonctionne très bien, mais je voudrais utiliserXSLT - Match élément variable dans prédicat

<xsl:apply-templates select="element[$childElementName='Yes']"> 

Je peux utiliser une variable pour spécifier le noeud.

Par exemple

<xsl:apply-templates select="theList/entity[Central='Yes']"> 

fonctionne très bien contre:

<?xml version="1.0" encoding="utf-8"?> 
<theList> 
    <entity> 
    <Business-Name>Company 1</Business-Name> 
    <Phone-Number>123456</Phone-Number> 
    <Central>Yes</Central> 
    <region1>No</region1> 
    <region2>Yes</region2> 
    <region3>No</region3> 
    <Northern>No</Northern> 
    </entity> 
    <entity> 
    <Business-Name>Company 2</Business-Name> 
    <Phone-Number>123456</Phone-Number> 
    <Central>No</Central> 
    <region1>Yes</region1> 
    <region2>No</region2> 
    <region3>No</region3> 
    <Northern>Yes</Northern> 
    </entity> 
    <entity> 
    <Business-Name>Company 3</Business-Name> 
    <Phone-Number>123456</Phone-Number> 
    <Central>Yes</Central> 
    <region1>No</region1> 
    <region2>No</region2> 
    <region3>No</region3> 
    <Northern>No</Northern> 
    </entity> 
    <entity> 
    <Business-Name>Company 4</Business-Name> 
    <Phone-Number>123456</Phone-Number> 
    <Central>No</Central> 
    <region1>No</region1> 
    <region2>No</region2> 
    <region3>No</region3> 
    <Northern>No</Northern> 
    </entity> 
</theList> 

Mais je ne veux pas coder en dur le nom de l'élément enfant.

Des suggestions?

Merci Tim pour la réponse:

<xsl:apply-templates select="theList/entity[child::*[name()=$childElement]='Yes']" /> 
+0

Ne serait-sélectionner une 'entity' qui a un nœud descendant avec une valeur de «Oui» atteindre la même chose? – Oded

+0

Bonne question (+1). Voir ma réponse pour une solution très courte et simple. :) –

Répondre

3

Vous pouvez tester le nom d'un élément en utilisant la fonction nom local(), comme si

<xsl:apply-templates select="theList/entity[child::*[name()='Central']='Yes']" /> 

Ce contrôle tous les nœuds enfants qui ont le nom de 'Central'

Vous pouvez alors facilement remplacer le codage en dur par un paramètre ou une variable. Ainsi, si vous utilisez le XSLT suivant sur votre entrée XML:

<?xml version="1.0"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:param name="childElement">Central</xsl:param> 
    <xsl:template match="/"> 
    <xsl:apply-templates select="theList/entity[child::*[name()=$childElement]='Yes']" /> 
    </xsl:template> 
    <xsl:template match="entity"> 
    <Name><xsl:value-of select="Business-Name" /></Name> 
    </xsl:template> 
</xsl:stylesheet> 

vous obtiendrez la sortie

<Name>Company 1</Name><Name>Company 3</Name> 
+1

Bonne réponse. Mais, je pense qu'il faut dire qu'avec 'local-name()' vous sélectionnez chaque élément 'Central' dans n'importe quel espace de noms (vide inclus). Avec 'name()' vous sélectionnez chaque élément 'Central' dans un espace de noms vide ou dans un espace de noms par défaut. Pour une correspondance stricte, vous devez ajouter une condition 'namespace-uri()'. –

+0

Bon point. J'ai changé mon exemple pour utiliser name() à la place. –

2

Utilisation:

theList/entity/*[name() = $childElementName][. = 'Yes'] 
Questions connexes