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

funciona bien, pero me gustaría utilizarXSLT - Coincidir elemento variable en el predicado

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

así que puedo utilizar una variable para especificar el nodo.

Por ejemplo

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

funciona bien en contra:

<?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> 

Pero yo no desean codificar el nombre del elemento hijo.

¿Alguna sugerencia?

Gracias a Tim por la respuesta:

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

No sería seleccionar cualquier 'entity' que tiene un nodo descendiente con un valor de 'Sí 'para lograr lo mismo? – Oded

+0

Buena pregunta (+1). Vea mi respuesta para una solución muy corta y simple. :) –

Respuesta

3

Puede comprobar el nombre de un elemento utilizando la función local-name(), al igual que

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

Esto comprueba todos los nodos secundarios que tienen el nombre de 'Central'

Puede reemplazar fácilmente la codificación con un parámetro o variable. Por lo tanto, si se utiliza la siguiente XSLT en su entrada 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> 

se llega a la salida de

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

Buena respuesta. Pero, creo que debe decirse que con 'local-name()' selecciona cada elemento 'Central' en cualquier espacio de nombres (vacío incluido). Con 'name()' selecciona cada elemento 'Central' en el espacio de nombres vacío o en el espacio de nombres predeterminado. Para una coincidencia estricta, debe agregar una condición 'namespace-uri()'. –

+0

Buen punto. Cambié mi ejemplo para usar name() en su lugar. –

2

Uso:

theList/entity/*[name() = $childElementName][. = 'Yes'] 
Cuestiones relacionadas