2013-10-10 37 views
0

我的XML包含以下幾行。我想添加子標籤<PV1.2> IN </PV1.2>如果<PV1.18>的值爲「INR」。如果另一個childtag在XSLT中有特定的字符串,我們如何添加一個子標籤?

<PV1> 
    <PV1.1>0001</PV1.1> 
    <PV1.3> 
    <PL.1>5N</PL.1> 
    <PL.2>0552</PL.2> 
    <PL.3>0B</PL.3> 
    </PV1.3> 
    <PV1.8>INR</PV1.8> 
    <PV1.19> 
    <CX.1>000002194171</CX.1> 
    </PV1.19> 
</PV1> 

輸出768,16是:

<PV1> 
    <PV1.1>0001</PV1.1> 
    <PV1.2>IN</PV1.2> 
    <PV1.3> 
    <PL.1>5N</PL.1> 
    <PL.2>0552</PL.2> 
    <PL.3>0B</PL.3> 
    </PV1.3> 
    <PV1.8>INR</PV1.8> 
    <PV1.19> 
    <CX.1>000002194171</CX.1> 
    </PV1.19> 
</PV1> 

的一段代碼我在XSLT嘗試是如下;但它不工作:

<xsl:template match="PV1"> 
    <xsl:choose> 
    <xsl:when test="PV1.18 eq 'INR'"> 
     <PV1.2>IN</PV1.2> 
    </xsl:when> 
    </xsl:choose> 
</xsl:template> 
+0

將來,請正確縮進您的XML。另外,請具體說明「不行」的含義。 –

+0

@Jim,我的意思是說它沒有添加 IN。 – Robie

回答

1

看着你所提供的XSLT模板,不僅會不添加PV1.2元素,它應該輸出什麼都沒有,因爲它沒有任何代碼複製所有現有元素。

無論如何,這可能是一個錯字,但是您的當前模板正在尋找PV1.18,因爲您的XML中沒有任何模板。我想你的XML示例中的PV1.8應該是PV1.18。 (我也認爲你應該在這裏使用'='而不是'eq')。理想的情況是,雖然,這應該檢查不應該在一個XSL:選擇(尤其是當你沒有一個的xsl:否則),但你應該做的檢查在模板匹配

<xsl:template match="PV1[PV1.18 = 'INR']"> 

然後在模板中,您將不得不復制現有元素,創建元素,創建元素,並輸出子元素。

試試這個XSLT

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output method="xml" indent="yes"/> 

    <xsl:template match="PV1[PV1.18 = 'INR']"> 
     <xsl:copy> 
     <xsl:apply-templates select="PV1.1"/> 
     <PV1.2>IN</PV1.2> 
     <xsl:apply-templates select="*[not(self::PV1.1)]"/> 
     </xsl:copy> 
    </xsl:template> 

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

這裏要注意的主要問題是使用了身份的轉換,這將在所有其他元素複製原樣,所以你只需要爲你需要的東西模板轉變。這裏有兩個xsl:apply-templates,因爲它看起來像你不會在PV1.1之後插入PV1.2

對於不具有PV1.18 ='INR'的PV1元素的情況,則標識模板完成所有工作,並且輸出將與輸入相同。

相關問題