2013-01-08 60 views
1

XML:的XSLT循環雖然XML來檢查是否值存在

<amenities> 
    <record> 
    <thekey>77</thekey> 
    <thevalue>Balcony</thevalue> 
    </record> 
    <record> 
    <thekey>75</thekey> 
    <thevalue>Cable</thevalue> 
    </record> 
    <record> 
    <thekey>35</thekey> 
    <thevalue>High Speed Internet</thevalue> 
    </record> 
    <record> 
    <thekey>16</thekey> 
    <thevalue>Fireplace</thevalue> 
    </record> 
    <record> 
    <thekey>31</thekey> 
    <thevalue>Garage</thevalue> 
    </record> 
    <record> 
    <thekey>32</thekey> 
    <thevalue>Phone</thevalue> 
    </record> 
</amenities> 

我需要檢查每一個設施記錄,以找出是否「35」(高速互聯網)的存在。設施中的記錄可能會有所不同。有時它會有35(高速互聯網),有時它不會。我需要能夠在XSLT中檢查這一點。

+0

埃米爾,好的問題+1。您可能有興趣查看幾種實現此功能的替代方法。 –

回答

1

有不同的方式來寫XSLT的條件下,它的聲音,如果你只是想編寫一個模式匹配您的條件和其他不符合它:

<xsl:template match="amenities[record[thekey = 35 and thevalue = 'High Speed Internet']]">high speed internet exists</xsl:template> 

<xsl:template match="amenities[not(record[thekey = 35 and thevalue = 'High Speed Internet'])]">high speed internet does not exist</xsl:template> 

當然,你也可以寫一個模板匹配amenities元素,然後在內部使用xsl:ifxsl:choose

<xsl:template match="amenities"> 
    <xsl:choose> 
    <xsl:when test="record[thekey = 35 and thevalue = 'High Speed Internet']">exists</xsl:when> 
    <xsl:otherwise>does not exist</xsl:otherwise> 
    </xsl:choose> 
</xsl:template> 
+0

非常感謝! xsl模板匹配完美。 – Amir

0

在最簡單的構成對這個問題的解決方案是一個單一的,純的XPath表達式

/*/record[thekey = 35 and thevalue = 'High Speed Internet'] 

這個選擇屬於XML文檔的頂部元件的兒童和所有record元件有一個thekey子字符串值,當轉換爲數字等於35並且有一個thevalue孩子,其字符串值是字符串'高速互聯網'。

所有record元素具有這種性質

/*/record[not(thekey = 35 and thevalue = 'High Speed Internet')] 

你可以通過簡單地指定相應的XPath表達式爲一體的select參數處理這些節點一個xsl:apply-templates(推薦)或的xsl:for-each指令。

<xsl:apply-templates select="/*/record[thekey = 35 and thevalue = 'High Speed Internet']"/> 

請注意,只是從這個XPath表達式獲得的匹配模式指定xsl:template,根本不能保證模板將執行選擇 - 這取決於是否應用模板(明確地或隱含地)。

訪問感興趣的所有節點的一個有效的,僅XSLT-方式是通過使用一個

<xsl:key name="kRecByKeyAndVal" match="record" use="concat(thekey,'+',thevalue)"/> 

上面指定的索引對所有record元素,基於所述級聯其thekeythevalue孩子(由合適的分隔符字符串('+')消除歧義,保證不會出現在這些值中)。

然後,順便指所有record元素有thekey孩子字符串值「35」和thevalue孩子字符串值「高速上網」是:

key('kRecByKeyAndVal', '35+High Speed Internet') 

使用鑰匙無論何時表達多於一次,我們都會給予我們極高的效率(速度)。