代码之家  ›  专栏  ›  技术社区  ›  Pavan

XSLT选择段下的最后一个位置

  •  0
  • Pavan  · 技术社区  · 1 年前

    我的要求是通过删除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>
    
     
       
            
    
    1 回复  |  直到 1 年前
        1
  •  0
  •   Martin Honnen    1 年前

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

      <xsl:template match="GS9/GS15[position() != last()]"/>
    
      <xsl:mode on-no-match="shallow-copy"/>