2012-06-08 198 views
-2

重複的標籤我有一個這樣的XML元素:迭代通過XML

<book> 
    <English color="blue" author="hasan" /> 
    <English color="red" author="david" /> 
</book> 

是否有可能使用XSLT來遍歷它併產生類似下面的輸出?

<book> 
    <English color="yellow" author="hally" /> 
    <English color="pink" author="gufoo" /> 
</book> 

這是我正在嘗試的;

<xsl:template match = /book> 
    <xsl:for-each select "./English"> 
    <xsl:if test="@color = '"yellow"'"> 
    <English color="yellow"/> 
    <xsl:if test="@color = '"red"'"> 
    <English color="pink"/> 
    </xsl:for-each> 
</xsl-template> 
+0

除了屬性的值,在那裏應該在這裏有區別嗎? –

+0

你有什麼嘗試?而且,這兩個文件只共享結構,數據完全不同。控制轉型的規則是什麼?請閱讀[常見問題]和[問]發佈準則。 –

+0

對不起,如果我的表達方法不正確。我需要的是,如果「顏色」屬性爲藍色,則應該用黃色代替,如果顏色是紅色,則應該用粉紅色代替。 – parameswar

回答

0

試試下面的樣式表。我擺脫了xsl:for-each元素,因爲我認爲這樣做更簡單。另外,在像XSL這樣的聲明式語言中使用foreach循環對我來說並不合適。我寧願讓那些命令式語言。

有很多不同的方法可以實現這樣的結果。你應該花一點時間來嘗試修改這個並且嘗試一下。 作爲練習,您可以刪除if語句,並嘗試使用模板和謂詞獲得類似的結果。在這之前,您可能需要閱讀XSL上的一些教程。

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 

    <!-- Copy every element or attribute encountered 
     and find matching templates for its attributes 
     and child elements 
    --> 
    <xsl:template match="@*|*"> 
    <xsl:copy> 
     <xsl:apply-templates select="@*|*"></xsl:apply-templates> 
    </xsl:copy> 
    </xsl:template> 

    <!-- For every attribute named "color" that has a value of red or blue, 
    follow the conditions defined in if blocks. 
    Notice that the specified color attributes will not be copied according 
    to the template above as the one selected is always the last 
    matching one in your XSL. 
    This way both the "author" attributes and "color" attributes with values 
    different than red and blue will be matched by the other template. 
    The dot "." means the currently processed node (usually element or attribute) 
    --> 
    <xsl:template match="@color[. = 'blue' or . = 'red']"> 
    <xsl:attribute name="color"> 
    <xsl:if test=". = 'blue'">yellow</xsl:if> 
    <xsl:if test=". = 'red'">pink</xsl:if> 
    </xsl:attribute> 
    </xsl:template> 

+0

您應該用標識轉換(http://www.w3.org/TR/xslt#copying)替換前兩個模板。 –

+0

@DevNull的確如此,我想用另一種方式來做,但我在一半的時候改變了主意,我承認結果有點混亂。 – toniedzwiedz