需要使用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>
+1有一个很好的答案。 –