我的要求是通过删除其中的其他 GS15 来考虑 HEADER/GS9 下最后一次 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>
对 GS9 父元素的任何非最后一个 GS15 子元素以及身份转换使用空模板
<xsl:template match="GS9/GS15[position() != last()]"/>
<xsl:mode on-no-match="shallow-copy"/>