2017-08-28 30 views
0

根據以下輸入xml,如果orderitem在父級別爲「desktop」類型,則更新與父級價格相同的所有子訂單項目的價格。 orderitem是遞歸的,可以有1-n個訂單項。爲了簡單起見,我考慮了3個孩子和1個父母orderitem。 我有另一個涉及依賴的問題,即如果父母有一個objectid並且它與孩子的objectid匹配,然後更新價格。但是,一旦解決,我會問一個新的問題。謝謝。XSLT-根據特定元素的值從父項到子項複製值

<listoforders> 
<Orderitem> 
    <name>Desktop</name> 
    <place>NZ</place> 
    <price>120</price> 
    <Orderitem> 
    <name>Desktop2</name> 
    <place>NZ</place> 
    <price>130</price> 
    </Orderitem> 
    <Orderitem> 
    <name>Desktop3</name> 
    <place>NZ</place> 
    <price>130</price> 
    </Orderitem> 
</Orderitem> 
</listoforders> 

結果:

<listoforders> 
    <Orderitem> 
    <name>Desktop</name> 
    <place>NZ</place> 
    <price>120</price> 
    <Orderitem> 
    <name>Desktop2</name> 
    <place>NZ</place> 
    <price>120</price> 
    </Orderitem> 
    <Orderitem> 
    <name>Desktop3</name> 
    <place>NZ</place> 
    <price>120</price> 
    </Orderitem> 
</Orderitem> 
</listoforders>  

很簡單,但是我不能夠通過身份規則來做到這一點。我需要在這裏使用for-each嗎?

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
<xsl:output omit-xml-declaration="yes" indent="yes"/> 
<xsl:strip-space elements="*"/> 
<xsl:template match="node()|@*"> 
    <xsl:copy> 
    <xsl:apply-templates select="node()|@*"/> 
    </xsl:copy> 
</xsl:template> 
<xsl:template match="orderitem[name='Desktop']/price"> 
<xsl:variable name="temp" select="*[(self::price)]"/> 
<xsl:copy> 
    <xsl:value-of select=$temp </xsl:value-of> 
    <xsl:apply-templates select="*[(child::price)]"/> 
</xsl:copy>  
</xsl:template> 
</xsl:stylesheet> 

在此先感謝。

問候 Krish

回答

0

如何:

XSLT 1.0

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/> 
<xsl:strip-space elements="*"/> 

<!-- identity transform --> 
<xsl:template match="@*|node()"> 
    <xsl:copy> 
     <xsl:apply-templates select="@*|node()"/> 
    </xsl:copy> 
</xsl:template> 

<xsl:template match="price[../../name='Desktop']"> 
    <xsl:copy-of select="../../price"/>   
</xsl:template> 

</xsl:stylesheet> 
+0

感謝邁克爾,你能好心幫助我理解這一點吧。我的理解是,我們與價格元素相匹配,其名稱爲'桌面'兩代以上,然後通過選擇父級價格來複制價格。我對它的工作原理感到困惑。謝謝。 – Krish

+0

我們正在匹配'Price',其祖父母的名字是「Desktop」,然後複製祖父母的價格。這與改變其父母名稱爲「桌面」的「Orderitem」的價格相同。我們只想改變價格,所以要做的就是直接匹配它,而不是它的父母。 –

+0

那麼它如何將價格應用於其子元素(而不是另一個orderitem中的價格)。它是隱含的嗎?它不一定是祖父母,也可以是父母。 – Krish

相關問題