0

我需要按孙子的值对节点进行排序。为此,我找到了不同的示例,但是子 G_SG16 出现了几次,我需要添加一个限定符(此处为 DOC)。也可能是限定符 DOC 没有退出。

这里应该排序的行项目节点 G_SG15 包括所有子注释:

<?xml version="1.0" encoding="UTF-8"?>
<ns0:DESADV96A xmlns:ns0="urn:DESADV">
    <DifferentNodes/>
    <G_SG10>
        <G_SG15>
            <S_LIN>
                <D_1082>10</D_1082>
            </S_LIN>
            <G_SG16>
                <S_RFF>
                    <C_C506>
                        <D_1153>DOC</D_1153>
                        <D_1154>333</D_1154>
                    </C_C506>
                </S_RFF>
            </G_SG16>
            <G_SG16>
                <S_RFF>
                    <C_C506>
                        <D_1153>WE</D_1153>
                        <D_1154>Customer</D_1154>
                        <D_1156/>
                        <D_4000/>
                    </C_C506>
                </S_RFF>
            </G_SG16>
        </G_SG15>
        <G_SG15>
            <S_LIN>
                <D_1082>20</D_1082>
            </S_LIN>
            <G_SG16>
                <S_RFF>
                    <C_C506>
                        <D_1153>DOC</D_1153>
                        <D_1154>111</D_1154>
                    </C_C506>
                </S_RFF>
            </G_SG16>
            <G_SG16>
                <S_RFF>
                    <C_C506>
                        <D_1153>WE</D_1153>
                        <D_1154>Customer</D_1154>
                        <D_1156/>
                        <D_4000/>
                    </C_C506>
                </S_RFF>
            </G_SG16>
        </G_SG15>
        <G_SG15>
            <S_LIN>
                <D_1082>30</D_1082>
            </S_LIN>
            <G_SG16>
                <S_RFF>
                    <C_C506>
                        <D_1153>DOC</D_1153>
                        <D_1154>222</D_1154>
                    </C_C506>
                </S_RFF>
            </G_SG16>
            <G_SG16>
                <S_RFF>
                    <C_C506>
                        <D_1153>WE</D_1153>
                        <D_1154>Customer</D_1154>
                        <D_1156/>
                        <D_4000/>
                    </C_C506>
                </S_RFF>
            </G_SG16>
        </G_SG15>
        <G_SG15>
            <S_LIN>
                <D_1082>40</D_1082>
            </S_LIN>
            <G_SG16>
                <S_RFF>
                    <C_C506>
                        <D_1153>WE</D_1153>
                        <D_1154>Customer</D_1154>
                        <D_1156/>
                        <D_4000/>
                    </C_C506>
                </S_RFF>
            </G_SG16>
        </G_SG15>
    </G_SG10>
</ns0:DESADV96A>

结果应该是这样的。没有 DOC 的节点是否出现在排序列表的开头或结尾并不重要。

result
<?xml version="1.0" encoding="UTF-8"?>
<ns0:DESADV96A xmlns:ns0="urn:DESADV">
    <DifferentNodes/>
    <G_SG10>
        <G_SG15>
            <S_LIN>
                <D_1082>20</D_1082>
            </S_LIN>
            <G_SG16>
                <S_RFF>
                    <C_C506>
                        <D_1153>DOC</D_1153>
                        <D_1154>111</D_1154>
                    </C_C506>
                </S_RFF>
            </G_SG16>
            <G_SG16>
                <S_RFF>
                    <C_C506>
                        <D_1153>WE</D_1153>
                        <D_1154>Customer</D_1154>
                        <D_1156/>
                        <D_4000/>
                    </C_C506>
                </S_RFF>
            </G_SG16>
        </G_SG15>
        <G_SG15>
            <S_LIN>
                <D_1082>30</D_1082>
            </S_LIN>
            <G_SG16>
                <S_RFF>
                    <C_C506>
                        <D_1153>DOC</D_1153>
                        <D_1154>222</D_1154>
                    </C_C506>
                </S_RFF>
            </G_SG16>
            <G_SG16>
                <S_RFF>
                    <C_C506>
                        <D_1153>WE</D_1153>
                        <D_1154>Customer</D_1154>
                        <D_1156/>
                        <D_4000/>
                    </C_C506>
                </S_RFF>
            </G_SG16>
        </G_SG15>
        <G_SG15>
            <S_LIN>
                <D_1082>10</D_1082>
            </S_LIN>
            <G_SG16>
                <S_RFF>
                    <C_C506>
                        <D_1153>DOC</D_1153>
                        <D_1154>333</D_1154>
                    </C_C506>
                </S_RFF>
            </G_SG16>
            <G_SG16>
                <S_RFF>
                    <C_C506>
                        <D_1153>WE</D_1153>
                        <D_1154>Customer</D_1154>
                        <D_1156/>
                        <D_4000/>
                    </C_C506>
                </S_RFF>
            </G_SG16>
        </G_SG15>
        <G_SG15>
            <S_LIN>
                <D_1082>40</D_1082>
            </S_LIN>
            <G_SG16>
                <S_RFF>
                    <C_C506>
                        <D_1153>WE</D_1153>
                        <D_1154>Customer</D_1154>
                        <D_1156/>
                        <D_4000/>
                    </C_C506>
                </S_RFF>
            </G_SG16>
        </G_SG15>
    </G_SG10>
</ns0:DESADV96A>

我测试了这个,但它只是按原样返回源文本:

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="xml" indent="yes"/>
    <xsl:template match="node()|@*">
        <xsl:copy>
            <xsl:apply-templates select="node()|@*"/>
        </xsl:copy>
    </xsl:template>
    
    <xsl:template match="G_SG15">
        <xsl:copy>
            <xsl:apply-templates select="node()|@*">
                <xsl:sort select="/G_SG16/S_RFF/C_C506/D_1154" order="ascending" data-type="text"/>
            </xsl:apply-templates>
        </xsl:copy>
    </xsl:template>
</xsl:stylesheet>

当然,预选赛仍然没有,但我希望他能以某种方式开始排序。

我正在为此使用在线编辑器。有谁知道 XSLT 的好(免费)调试器?特别是为什么我的规则没有被使用,我无法用一个简单的编辑器看到。

感谢您的支持 :-) 克里斯

4

1 回答 1

0

花了我一点时间,但我通过尝试和错误弄清楚:

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
    <!-- identity transform -->
    <xsl:template match="@*|node()">
        <xsl:copy>
            <xsl:apply-templates select="@*|node()"/>
        </xsl:copy>
    </xsl:template>
    <xsl:template match="G_SG10">
        <xsl:copy>
            <xsl:apply-templates select="*[not(contains(name(), 'G_SG15'))]"/>
            <xsl:apply-templates select="G_SG15">
                <xsl:sort select="G_SG16/S_RFF/C_C506[D_1153='DOC']/D_1154" data-type="text" order="ascending"/>
            </xsl:apply-templates>
        </xsl:copy>
    </xsl:template>
</xsl:stylesheet>

我的第一个错误不是选择 G_SG10 而是选择 G_SG15 来对不起作用的 G_SG15 进行排序。使用 [not(contains(name(), 'G_SG15'))] 添加 G_SG15 旁边的所有子节点也有点尝试和错误。主要问题是如果您没有 XMLSpy 或类似的东西来调试 XSL。

问候克里斯

于 2020-10-26T12:48:49.373 回答