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

działa dobrze, ale chciałbym używaćXSLT - mecz zmienny element orzecznika

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

więc mogę użyć zmiennej aby określić węzeł.

Na przykład

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

działa dobrze przed:

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

Ale nie chcą ciężko kodem nazwa elementu dziecko.

Wszelkie sugestie?

Dzięki Tim dla odpowiedź:

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

Would not wybierając jakąkolwiek 'entity' który ma węzeł potomny o wartości 'Tak' osiąga to samo? – Oded

+0

Dobre pytanie (+1). Zobacz moją odpowiedź na bardzo krótkie i proste rozwiązanie. :) –

Odpowiedz

3

można przetestować nazwę elementu za pomocą funkcji local-name(), tak jak

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

ten sprawdza wszystkie węzły potomne, które mają Nazwa "Central" może być łatwo zastąpiona przez kodowanie za pomocą parametru lub zmiennej. Tak więc, jeśli można użyć następującego XSLT na wejściu 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> 

można byłoby uzyskać wyjście

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

Dobra odpowiedź. Ale myślę, że należy powiedzieć, że przy 'local-name()' wybierasz każdy element 'Central' w dowolnej przestrzeni nazw (puste). Za pomocą 'name()' wybierasz każdy element 'Central' w pustej przestrzeni nazw lub domyślnej przestrzeni nazw. Aby uzyskać ścisłe dopasowanie, musisz dodać warunek 'namespace-uri()'. –

+0

Dobra uwaga. Zmieniłem mój przykład, aby zamiast tego używać nazwy(). –

2

Używaj:

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