我的要求是通过删除HEADER/GS9下的其他GS15来考虑GS15的最后一次出现,如果GS9只有一次GS15出现或没有GS15,那么我们可以按原样复制GS9段。
如果输入中没有GS9,我们需要其余的数据。
如果HEADER下只存在一个GS9,我的xslt就可以工作了。对于多个GS9段,它给出了序列错误,请查看一次。
输入:
<?xml version="1.0" encoding="UTF-8"?>
<HEADER>
<SUBNODE>
<FIELD1>001</FIELD1>
</SUBNODE>
<GS1>
<FIELD1>12</FIELD1>
</GS1>
<GS9>
<SUBN>
<FIELD1>1</FIELD1>
</SUBN>
<GS11>
<FIELD1>12</FIELD1>
</GS11>
<GS15>
<GS16>
<ATC>
<FIELD1>HE</FIELD1>
</ATC>
</GS16>
</GS15>
<GS15>
<GS16>
<ATC>
<FIELD1>123</FIELD1>
</ATC>
</GS16>
</GS15>
</GS9>
<GS9>
<SUBN>
<FIELD1>1</FIELD1>
</SUBN>
<GS11>
<FIELD1>12</FIELD1>
</GS11>
<GS15>
<GS16>
<ATC>
<FIELD1>245</FIELD1>
</ATC>
</GS16>
</GS15>
<GS15>
<GS16>
<ATC>
<FIELD1>456</FIELD1>
</ATC>
</GS16>
</GS15>
</GS9>
<GS9>
<SUBN>
<FIELD1>1</FIELD1>
</SUBN>
<GS11>
<FIELD1>12</FIELD1>
</GS11>
</GS9>
<GS18>
<FIELD1>4141</FIELD1>
</GS18>
</HEADER>
期望输出:
<?xml version="1.0" encoding="UTF-8"?>
<HEADER>
<SUBNODE>
<FIELD1>001</FIELD1>
</SUBNODE>
<GS1>
<FIELD1>12</FIELD1>
</GS1>
<GS9>
<SUBN>
<FIELD1>1</FIELD1>
</SUBN>
<GS11>
<FIELD1>12</FIELD1>
</GS11>
<GS15>
<GS16>
<ATC>
<FIELD1>123</FIELD1>
</ATC>
</GS16>
</GS15>
</GS9>
<GS9>
<SUBN>
<FIELD1>1</FIELD1>
</SUBN>
<GS11>
<FIELD1>12</FIELD1>
</GS11>
<GS15>
<GS16>
<ATC>
<FIELD1>456</FIELD1>
</ATC>
</GS16>
</GS15>
</GS9>
<GS9>
<SUBN>
<FIELD1>1</FIELD1>
</SUBN>
<GS11>
<FIELD1>12</FIELD1>
</GS11>
</GS9>
<GS18>
<FIELD1>4141</FIELD1>
</GS18>
</HEADER>
我使用的XSLT如下:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">
<xsl:key name="gs15key" match="GS15" use="generate-id()"/>
<xsl:template match="/HEADER">
<HEADER>
<xsl:apply-templates select="node()"/>
</HEADER>
</xsl:template>
<xsl:template match="GS15">
<xsl:if test="generate-id() = generate-id(//GS15[last()])">
<G_SG15>
<xsl:apply-templates select="node()"/>
</G_SG15>
</xsl:if>
</xsl:template>
<xsl:template match="@* | node()">
<xsl:copy>
<xsl:apply-templates select="@* | node()"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>