XSLT 选择段下的最后位置

问题描述 投票:0回答:1

我的要求是通过删除其中的其他 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>

 
   
        
xslt-2.0 xslt-3.0
1个回答
0
投票

对 GS9 父元素的任何非最后一个 GS15 子元素以及身份转换使用空模板

  <xsl:template match="GS9/GS15[position() != last()]"/>

  <xsl:mode on-no-match="shallow-copy"/>
© www.soinside.com 2019 - 2024. All rights reserved.