2011-09-08 49 views
-1

我有一塊如下。需要使用xsl將塊添加到現有的xml portin

<items> 
<item> 
<itemName>Pen</itemName> 
<cost>200</cost> 
</item> 
<item> 
<itemName>Book</itemName> 
<cost>100</cost> 
</item> 
<item> 
<itemName>Bag</itemName> 
<cost>250</cost 
</item> 
</items> 

我需要經過上述塊,如果我沒有找到名爲鉛筆的任何項目,然後我需要如下補充鉛筆。

<item> 
<itemName>Pencil</itemName> 
<cost>20</cost> 
</item> 

請給我一些指點。邏輯應該也處理下面的senario。

<items> 
<item/> 
</items> 

在上述參數中,輸出需要如下。

<items> 
<item> 
<itemName>Pencil</itemName> 
<cost>20</cost> 
</item> 
</items> 

回答

2

這可以通過身份轉換來實現,使用一些額外的模板來匹配您需要的情況。

要匹配項目不包含鉛筆項目元素,你可以使用下面的

<xsl:template match="items[not(item[itemName='Pencil'])]"> 

此外,您需要忽略空項目元素,像這樣

<xsl:template match="item[not(node())]" /> 

綜合以下XSLT

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

    <xsl:template match="items[not(item[itemName='Pencil'])]"> 
     <xsl:copy> 
     <item> 
      <itemName>Pencil</itemName> 
      <cost>20</cost> 
     </item> 
     <xsl:apply-templates select="@*|node()"/> 
     </xsl:copy> 
    </xsl:template> 

    <xsl:template match="item[not(node())]" /> 

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

當施加到您的輸入XML,輸出如下:

<items> 
    <item> 
     <itemName>Pencil</itemName> 
     <cost>20</cost> 
    </item> 
    <item> 
     <itemName>Pen</itemName> 
     <cost>200</cost> 
    </item> 
    <item> 
     <itemName>Book</itemName> 
     <cost>100</cost> 
    </item> 
    <item> 
     <itemName>Bag</itemName> 
     <cost>250</cost> 
    </item> 
</items> 

另外,當輸入如下:

<items> 
    <item/> 
</items> 

的輸出將是如下:

<items> 
    <item> 
    <itemName>Pencil</itemName> 
    <cost>20</cost> 
    </item> 
</items> 
+0

+1有一個很好的答案。 –

相關問題