Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xslt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
XSLT1.0:将一个值分组为多个值-使用键?_Xslt_Grouping - Fatal编程技术网

XSLT1.0:将一个值分组为多个值-使用键?

XSLT1.0:将一个值分组为多个值-使用键?,xslt,grouping,Xslt,Grouping,我有以下简化的XML结构: <?xml version="1.0" encoding="UTF-8" standalone="no"?> <DESADV> <M_DESADV> <G_SG10> <G_SG13> <S_GIN> <id>GIN</id> <D_7405_6>BJ

我有以下简化的XML结构:

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<DESADV>
<M_DESADV>
    <G_SG10>
        <G_SG13>
            <S_GIN>
                <id>GIN</id>
                <D_7405_6>BJ</D_7405_6>
                <C_C208_2>
                    <D_7402_8>373500699550026556</D_7402_8>
                </C_C208_2>
            </S_GIN>
        </G_SG13>
    </G_SG10>
    <G_SG10>
        <G_SG17>
            <S_PIA>
                <id>PIA</id>
                <D_4347>1</D_4347>
                <C_C212_2>
                    <D_7140_2>110005</D_7140_2>
                    <D_7143_4>SA</D_7143_4>
                </C_C212_2>
            </S_PIA>
        </G_SG17>
    </G_SG10>
    <G_SG10>
        <G_SG17>
            <S_PIA>
                <id>PIA</id>
                <D_4347>1</D_4347>
                <C_C212_2>
                    <D_7140_2>123456</D_7140_2>
                    <D_7143_4>SA</D_7143_4>
                </C_C212_2>
            </S_PIA>
        </G_SG17>
    </G_SG10>
    <G_SG10>
        <G_SG13>
            <S_GIN>
                <id>GIN</id>
                <D_7405_6>BJ</D_7405_6>
                <C_C208_2>
                    <D_7402_8>3735009999999999</D_7402_8>
                </C_C208_2>
            </S_GIN>
        </G_SG13>
    </G_SG10>
    <G_SG10>
        <G_SG17>
            <S_PIA>
                <id>PIA</id>
                <D_4347>1</D_4347>
                <C_C212_2>
                    <D_7140_2>632154</D_7140_2>
                    <D_7143_4>SA</D_7143_4>
                </C_C212_2>
            </S_PIA>
        </G_SG17>
    </G_SG10>
    <G_SG10>
        <G_SG17>
            <S_PIA>
                <id>PIA</id>
                <D_4347>1</D_4347>
                <C_C212_2>
                    <D_7140_2>887796</D_7140_2>
                    <D_7143_4>SA</D_7143_4>
                </C_C212_2>
            </S_PIA>
        </G_SG17>
    </G_SG10>
</M_DESADV>
</DESADV>

杜松子酒
北京
373500699550026556
巴基斯坦国际航空公司
1.
110005
沙特阿拉伯
巴基斯坦国际航空公司
1.
123456
沙特阿拉伯
杜松子酒
北京
3735009999999999
巴基斯坦国际航空公司
1.
632154
沙特阿拉伯
巴基斯坦国际航空公司
1.
887796
沙特阿拉伯
我需要进行映射,以便获得以下XML输出:

<?xml version="1.0" encoding="UTF-8"?>
<list>
<number>373500699550026556 110005</number>
<number>373500699550026556 123456</number>
<number>3735009999999999 632154</number>
<number>3735009999999999 887796</number>
</list>

373500699550026556 110005
373500699550026556 123456
3735009999999999 632154
3735009999999999 887796
不过,我很难获得输出。我认为可以使用以下XSLT:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="1.0">

<xsl:template match="text()"/>

<xsl:template match="/">
    <list>
    <xsl:apply-templates/>
    </list>
</xsl:template>

<xsl:template match="M_DESADV">

    <xsl:for-each select="G_SG10/G_SG17/S_PIA/C_C212_2[D_7143_4='SA']/D_7140_2">
        <number>
            <xsl:value-of select="concat(
                parent::C_C212_2/parent::S_PIA/parent::G_SG17/parent::G_SG10/parent::M_DESADV
                /G_SG10/G_SG13/S_GIN[D_7405_6='BJ']/C_C208_2/D_7402_8,' ',
                .)
                "/>
        </number>
    </xsl:for-each>
</xsl:template>



</xsl:stylesheet>

但是我的输出看起来像这样,这不是我所期望的:

<?xml version="1.0" encoding="UTF-8"?>
<list>
<number>373500699550026556 110005</number>
<number>373500699550026556 123456</number>
<number>373500699550026556 632154</number>
<number>373500699550026556 887796</number>
</list>

373500699550026556 110005
373500699550026556 123456
373500699550026556 632154
373500699550026556 887796
这个问题可以通过明钦族的分组来解决吗?我试图设置一个键,但它要么选择 “D_7402_8”或仅“D_7140_2”

有人能告诉我怎么解决这个问题吗? 谢谢你,并致以最良好的祝愿,
彼得

我认为你不需要钥匙,你只需要找到每个
G_SG10
-that-has-a-
G_SG17
,它最近的前兄弟
G_SG10
-that-has-a-
G_SG13

<xsl:for-each select="G_SG10/G_SG17/S_PIA/C_C212_2[D_7143_4='SA']/D_7140_2">
    <number>
        <xsl:value-of select="concat(
            ancestor::G_SG10/preceding-sibling::G_SG10[G_SG13][1]
            /G_SG13/S_GIN[D_7405_6='BJ']/C_C208_2/D_7402_8,' ',
            .)
            "/>
    </number>
</xsl:for-each>

我认为你不需要钥匙,你只需要找到每个
G_SG10
-that-has-a-
G_SG17
,它最近的前兄弟
G_SG10
-that-has-a-
G_SG13

<xsl:for-each select="G_SG10/G_SG17/S_PIA/C_C212_2[D_7143_4='SA']/D_7140_2">
    <number>
        <xsl:value-of select="concat(
            ancestor::G_SG10/preceding-sibling::G_SG10[G_SG13][1]
            /G_SG13/S_GIN[D_7405_6='BJ']/C_C208_2/D_7402_8,' ',
            .)
            "/>
    </number>
</xsl:for-each>

你好,伊恩,非常感谢。它工作得很好。我以前从未与“祖先::”合作过。使用它,我可以避免所有的“parent::”-是这样吗?再次感谢你,PeterHello Ian,实际上我有一个SG_11在中间,所以我把路径改为“祖先::G_SG10/先前的兄弟姐妹::G_SG10[G_SG11/G_SG13][1]”非常好用!:-)+1@Peter是的,祖先轴按顺序查看您的父母、祖父母等(较小的数字表示“更接近”的祖先)。还有
祖先或自我::
如果您想在检查
之前使用
开始搜索。
。你好,伊恩,非常感谢。它工作得很好。我以前从未与“祖先::”合作过。使用它,我可以避免所有的“parent::”-是这样吗?再次感谢你,PeterHello Ian,实际上我有一个SG_11在中间,所以我把路径改为“祖先::G_SG10/先前的兄弟姐妹::G_SG10[G_SG11/G_SG13][1]”非常好用!:-)+1@Peter是的,祖先轴按顺序查看您的父母、祖父母等(较小的数字表示“更接近”的祖先)。如果要在选中
之前使用
开始搜索,还有
祖先或自我::