我是XSLT的新手,手动更改它需要花费很多时间.
<GroupData ID="xxx" Key="4" Temp="yyy"> <ItemData ID="zzz" Value="3"/> </GroupData> <GroupData ID="xxx" Key="4" Temp="yyy"> <ItemData ID="www" Value="1982"/> </GroupData>
我希望将这些多个GroupData节点的子节点放在同一个组中,即
<GroupData ID="xxx" Key="4" Temp="yyy"> <ItemData ID="zzz" Value="3"/> <ItemData ID="www" Value="1982"/> </GroupData>
所以我需要在GroupData的ID和Key属性上合并/组合/匹配它们(这些属性在文件中有所不同).还有一些没有Key属性.我怎样才能做到这一点?我读了一些其他的线程(例如,在C#中,但我没有这个可供我使用),我检查了W3学校,但这些都是非常基本的例子.我正在使用最新的XML Tools 2.3.2 r908 unicode(beta4)for Notepad来应用可能的转换(不知道它是否支持XSLT2.0或XSLT1.0).
编辑:尝试下面的建议和我遇到的各种事情,因为它有多个级别,可能没有唯一的ID:
…
解决方法
这个XSLT 1.0转换:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output omit-xml-declaration="yes" indent="yes"/> <xsl:strip-space elements="*"/> <xsl:key name="kGDByIdKey" match="GroupData" use="concat(@ID,'+',@Key)"/> <xsl:template match="node()|@*"> <xsl:copy> <xsl:apply-templates select="node()|@*"/> </xsl:copy> </xsl:template> <xsl:template match= "GroupData [generate-id() = generate-id(key('kGDByIdKey',concat(@ID,@Key))[1]) ]"> <xsl:copy> <xsl:apply-templates select= "@*|key('kGDByIdKey',@Key))/node()"/> </xsl:copy> </xsl:template> <xsl:template match="GroupData"/> </xsl:stylesheet>
应用于此XML文档时:
<t> <GroupData ID="xxx" Key="4" Temp="yyy"> <ItemData ID="zzz" Value="3"/> </GroupData> <GroupData ID="yyy" Key="4" Temp="yyy"> <ItemData ID="abc" Value="3"/> </GroupData> <GroupData ID="zzz" Temp="yyy"> <ItemData ID="pqr" Value="1982"/> </GroupData> <GroupData ID="xxx" Key="4" Temp="yyy"> <ItemData ID="www" Value="1982"/> </GroupData> <GroupData ID="yyy" Key="4" Temp="yyy"> <ItemData ID="def" Value="1982"/> </GroupData> <GroupData ID="zzz" Temp="yyy"> <ItemData ID="tuv" Value="1982"/> </GroupData> </t>
产生想要的,正确的结果:
<t> <GroupData ID="xxx" Key="4" Temp="yyy"> <ItemData ID="zzz" Value="3"/> <ItemData ID="www" Value="1982"/> </GroupData> <GroupData ID="yyy" Key="4" Temp="yyy"> <ItemData ID="abc" Value="3"/> <ItemData ID="def" Value="1982"/> </GroupData> <GroupData ID="zzz" Temp="yyy"> <ItemData ID="pqr" Value="1982"/> <ItemData ID="tuv" Value="1982"/> </GroupData> </t>
说明: