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

时间:2011-09-08 09:57:05

标签: xml xslt

我有一个块如下。

<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>

请给我一些指示。 逻辑应该也处理以下的事件。

<items>
<item/>
</items>

在上述情况中,输出需要如下所示。

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

1 个答案:

答案 0 :(得分:2)

这可以通过身份转换来实现,还有一些额外的模板可以满足您的需求。

要匹配不包含Pencil项目的元素,您可以使用以下

<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>