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

工作正常,但我想用XSLT - 在謂詞匹配的可變因素

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

,所以我可以用一個變量來指定節點。

例如

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

工作正常反對:

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

但我不想硬編碼子元素的名稱。

有什麼建議嗎?

感謝蒂姆的回答:

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

會不選擇任何'entity'具有值爲「是」的後代節點實現相同的事情? – Oded 2010-07-27 06:22:27

+0

好問題(+1)。看到我的答案是一個非常簡短的解決方案。 :) – 2010-07-27 13:07:48

回答

3

您可以使用本地名稱()函數,像這樣

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

這就驗證了具有所有子節點測試一個元素的名稱'Central'的名稱

然後,您可以輕鬆地用參數或變量替換硬編碼。因此,如果您使用以下XSLT你的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> 

你會得到輸出

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

很好的答案。但是,我認爲必須用'local-name()'來選擇任何名稱空間中的每個'Central'元素(包含空)。使用'name()'你可以在空的名字空間或默認名字空間中選擇每個'Central'元素。爲了嚴格匹配,你必須添加一個'namespace-uri()'條件。 – 2010-07-27 15:11:38

+0

好點。我已將示例更改爲使用name()。 – 2010-07-27 15:27:09

2

使用

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