我有一个块如下。
<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>
答案 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>