我一直在尝试使用XSLT 2.0合并两个相同的元素
示例源XML:
<?xml version="1.0" encoding="UTF-8"?>
<summary>
<object>
<para>Paragraph <ref>Test1.</ref>AAA</para>
<para>Test2.</para>
</object>
<objects>
<para>
<title>Title 1</title>: (1) Testing1</para>
<para>(2) Testing 2</para>
<para>Testing 3</para>
</objects>
<objects>
<para>
<title>Title 2</title>: Testing 4</para>
</objects>
所需的输出将是:
<summary>
<object>
<para>Paragraph <ref>Test1.</ref>AAA</para>
<para>Test2.</para>
</object>
<objects>
<para>
<title>Title 1</title>: (1) Testing1</para>
<para>(2) Testing 2</para>
<para>Testing 3</para>
<para>
<title>Title 2</title>: Testing 4</para>
</objects>
</summary>
我使用以下模板进行转换,遗憾的是它没有给我想要的结果..
<xsl:template match="summary">
<xsl:for-each select="//objects">
<xsl:element name="objects">
<xsl:for-each select="//objects/*">
<xsl:copy-of select="."/>
</xsl:for-each>
</xsl:element>
</xsl:for-each>
</xsl:template>
<xsl:template match="*|@*|comment()|processing-instruction()|text()" >
<xsl:copy copy-namespaces="no">
<xsl:apply-templates select="*|@*|comment()|processing-instruction()|text()" />
</xsl:copy>
</xsl:template>
答案 0 :(得分:0)
如果您只想合并所有objects
兄弟元素,那么
<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="objects[1]">
<xsl:copy>
<xsl:copy-of select="node(), following-sibling::objects/node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="objects[position() gt 1]"/>
</xsl:transform>
应该足够了。对于仅合并相邻的兄弟姐妹,您可以在匹配<xsl:for-each-group select="*" group-adjacent="boolean(self::objects)">...</xsl:for-each-group>
或任何summary
父级的模板中使用objects
。