我需要使用一些xslt,我不知道从哪里开始,希望你们至少可以给我一些线索。
来源xml
<ROW>
<DEPT> A </DEPT>
</ROW>
<ROW>
<DEPT> B </DEPT>
</ROW>
<ROW>
<DEPT> A </DEPT>
</ROW>
目标xml
<DEPTARTMENT>
<ROW>
<DEPT> A </DEPT>
</ROW>
<ROW>
<DEPT> A </DEPT>
</ROW>
</DEPARTMENT>
<DEPTARTMENT>
<ROW>
<DEPT> B </DEPT>
</ROW>
</DEPARTMENT>
感谢您的任何建议。
答案 0 :(得分:3)
这是一个可能的XSLT 1.0解决方案。
当这个XSLT:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:key name="kRowByDept" match="ROW" use="DEPT"/>
<xsl:template match="/*">
<T>
<xsl:apply-templates
select="ROW[generate-id() = generate-id(key('kRowByDept', DEPT)[1])]"/>
</T>
</xsl:template>
<xsl:template match="ROW">
<DEPARTMENT>
<xsl:copy-of select="key('kRowByDept', DEPT)"/>
</DEPARTMENT>
</xsl:template>
</xsl:stylesheet>
...适用于提供的XML(包含在顶级元素中以使文档格式正确):
<T>
<ROW>
<DEPT> A </DEPT>
</ROW>
<ROW>
<DEPT> B </DEPT>
</ROW>
<ROW>
<DEPT> A </DEPT>
</ROW>
</T>
...制作了所需的解决方案:
<T>
<DEPARTMENT>
<ROW>
<DEPT> A </DEPT>
</ROW>
<ROW>
<DEPT> A </DEPT>
</ROW>
</DEPARTMENT>
<DEPARTMENT>
<ROW>
<DEPT> B </DEPT>
</ROW>
</DEPARTMENT>
</T>
<强>解释强>
这是一个使用Muenchian Grouping的解决方案,这是一种特定于XSLT 1.0的方法,可以将元素组合在一起。
这是一个类似的XSLT 2.0解决方案;请注意,很多更直接。
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="/*">
<T>
<xsl:for-each-group select="ROW" group-by="DEPT">
<DEPARTMENT>
<xsl:copy-of select="current-group()" />
</DEPARTMENT>
</xsl:for-each-group>
</T>
</xsl:template>
</xsl:stylesheet>