如果属性的值相同,则XSL合并同级的值 [英] XSL combining values of siblings if values of an attribute is same
本文介绍了如果属性的值相同,则XSL合并同级的值的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
这是我的XML的样子
<?xml version="1.0"?>
<Nodes>
<NodeA NodeAattr="123">
<NodeB NodeBattr="456"></NodeB>
<NodeC>
<NodeD NodeDAttr="ValueD">
<NodeE Name="ValueABC"> "555" </NodeE >
<NodeE Name="ValueABC"> "666" </NodeE>
</NodeD>
</NodeC>
</NodeA>
</Nodes>
如果NodeE的Name属性的值相同,请连接NodeE的值。
而且我的最终输出xml必须看起来像
If the values of the Name attribute of NodeE are same, concatenate the values of NodeE. And my final output xml has to look like
<NodeA NodeAattr="123">
<NodeB NodeBattr="456"></NodeB>
<NodeC>
<NodeD="ValueD">
<NodeE Name="ValueABC"> "555" , "666" </NodeE >
</NodeD>
</NodeC>
</NodeA>
请向我提供xsl。我正在使用XSLT1.0
Please provide me with the xsl.. I am using XSLT1.0
推荐答案
应该这样做:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes" omit-xml-declaration="yes"/>
<xsl:strip-space elements="*" />
<xsl:template match="@* | node()">
<xsl:copy>
<xsl:apply-templates select="@* | node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="NodeE">
<xsl:copy>
<xsl:apply-templates select="@* | text()" />
<xsl:call-template name="NextSibling" />
</xsl:copy>
</xsl:template>
<xsl:template match="NodeE[@Name = preceding-sibling::*[1][self::NodeE]/@Name]" />
<xsl:template match="NodeE" mode="includeSib">
<xsl:value-of select="concat(',', .)"/>
<xsl:call-template name="NextSibling" />
</xsl:template>
<xsl:template name="NextSibling">
<xsl:apply-templates
select="following-sibling::*[1]
[self::NodeE and @Name = current()/@Name]"
mode="includeSib" />
</xsl:template>
</xsl:stylesheet>
在此输入上运行时(带有一些其他值来演示其功能):
When run on this input (with a few additional values to demonstrate its functionality):
<Nodes>
<NodeA NodeAattr="123">
<NodeB NodeBattr="456"></NodeB>
<NodeC>
<NodeD NodeDAttr="ValueD">
<NodeE Name="ValueABC"> "555" </NodeE >
<NodeE Name="ValueABC"> "666" </NodeE>
<NodeE Name="ValueDEF"> "555" </NodeE >
<NodeE Name="ValueDEF"> "565" </NodeE >
<NodeE Name="ValueDEF"> "575" </NodeE >
<NodeE Name="ValueABC"> "595" </NodeE >
</NodeD>
</NodeC>
</NodeA>
</Nodes>
结果是:
<Nodes>
<NodeA NodeAattr="123">
<NodeB NodeBattr="456" />
<NodeC>
<NodeD NodeDAttr="ValueD">
<NodeE Name="ValueABC"> "555" , "666" </NodeE>
<NodeE Name="ValueDEF"> "555" , "565" , "575" </NodeE>
<NodeE Name="ValueABC"> "595" </NodeE>
</NodeD>
</NodeC>
</NodeA>
</Nodes>
这篇关于如果属性的值相同,则XSL合并同级的值的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文