需要使用xsl将块添加到现有的xml portin

问题描述:

我有一块如下。需要使用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> 

这可以通过身份转换来实现,使用一些额外的模板来匹配您需要的情况。

要匹配项目不包含铅笔项目元素,你可以使用下面的

<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有一个很好的答案。 –