我正在尝试创建一个标头详细信息XML文档,从另一个xml设置。
源 xml 文档:
<items>
<item>
<col1>H</col1>
<col2>header1</col2>
</item>
<item>
<col1>D</col1>
<col2>detail1.1</col2>
</item>
<item>
<col1>D</col1>
<col2>detail1.2</col2>
</item>
<item>
<col1>H</col1>
<col2>header2</col2>
</item>
<item>
<col1>D</col1>
<col2>detail2.1</col2>
</item>
<item>
<col1>D</col1>
<col2>detail2.2</col2>
</item>
<item>
<col1>D</col1>
<col2>detail2.3</col2>
</item>
</items>
期望输出:
<xml>
<transaction>
<items>
<item>
<col1>H</col1>
<col2>header1</col2>
</item>
<item>
<col1>D</col1>
<col2>detail1.1</col2>
</item>
<item>
<col1>D</col1>
<col2>detail1.2</col2>
</item>
</items>
</transaction>
<transaction>
<items>
<item>
<col1>H</col1>
<col2>header2</col2>
</item>
<item>
<col1>D</col1>
<col2>detail2.1</col2>
</item>
<item>
<col1>D</col1>
<col2>detail2.2</col2>
</item>
<item>
<col1>D</col1>
<col2>detail2.3</col2>
</item>
</items>
</transaction>
</xml>
我尝试的 XSLT:
<xsl:transform version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" omit-xml-declaration="yes" indent="yes"/>
<xsl:template match="/ | node() | @* | comment() | processing-instruction()">
<xsl:copy>
<xsl:apply-templates select="@* | node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="item[col1='H']">
<transaction>
<xsl:apply-templates/>
</transaction>
</xsl:template>
</xsl:transform>
此转换:
<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="kItemByCol2Num" match="item[starts-with(col2, 'detail')]"
use="substring-before(substring-after(col2, 'detail'), '.')"/>
<xsl:key name="kItemByCol2Num" match="item[starts-with(col2, 'header')]"
use="substring-after(col2, 'header')"/>
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<xsl:template match=
"item
[starts-with(col2, 'header')
and
generate-id()
=
generate-id(key('kItemByCol2Num', substring-after(col2, 'header'))[1])
]">
<transaction>
<xsl:copy-of select="key('kItemByCol2Num', substring-after(col2, 'header'))"/>
</transaction>
</xsl:template>
<xsl:template match="item"/>
</xsl:stylesheet>
应用于提供的 XML 文档时:
<items>
<item>
<col1>H</col1>
<col2>header1</col2>
</item>
<item>
<col1>D</col1>
<col2>detail1.1</col2>
</item>
<item>
<col1>D</col1>
<col2>detail1.2</col2>
</item>
<item>
<col1>H</col1>
<col2>header2</col2>
</item>
<item>
<col1>D</col1>
<col2>detail2.1</col2>
</item>
<item>
<col1>D</col1>
<col2>detail2.2</col2>
</item>
<item>
<col1>D</col1>
<col2>detail2.3</col2>
</item>
</items>
产生所需的正确结果:
<items>
<transaction>
<item>
<col1>H</col1>
<col2>header1</col2>
</item>
<item>
<col1>D</col1>
<col2>detail1.1</col2>
</item>
<item>
<col1>D</col1>
<col2>detail1.2</col2>
</item>
</transaction>
<transaction>
<item>
<col1>H</col1>
<col2>header2</col2>
</item>
<item>
<col1>D</col1>
<col2>detail2.1</col2>
</item>
<item>
<col1>D</col1>
<col2>detail2.2</col2>
</item>
<item>
<col1>D</col1>
<col2>detail2.3</col2>
</item>
</transaction>
</items>
解释:
正确使用Muenchian方法进行分组。
正确使用钥匙。