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
Xslt 使用XSL连接基于多个元素的重复元素信息_Xslt_Duplicates_Concatenation_Elements - Fatal编程技术网

Xslt 使用XSL连接基于多个元素的重复元素信息

Xslt 使用XSL连接基于多个元素的重复元素信息,xslt,duplicates,concatenation,elements,Xslt,Duplicates,Concatenation,Elements,我在XSL方面没有那么聪明。 我有一个XML,如下所示: <?xml version="1.0" ?> <accountitem> <Entry_Date>2011-06-24T00:00:00-05:00</Entry_Date> <Contract>4570000010</Contract> <Account>0</Account>

我在XSL方面没有那么聪明。 我有一个XML,如下所示:

<?xml version="1.0" ?>
    <accountitem>
         <Entry_Date>2011-06-24T00:00:00-05:00</Entry_Date>
         <Contract>4570000010</Contract>
         <Account>0</Account>
         <general_desc>Systematic Withdrawal</general_desc>
         <net>1108.3700</net>
         <gross>1108.3700</gross>
         <Person_Name>WHITEY HOUSE</Person_Name>
         <Last_Name>HOUSE</Last_Name>
         <agent_name>BROWN, JACK</agent_name>
         <Legal_Verb>N</Legal_Verb>
         <Payeename>NONE</Payeename>
         <Closed_Flag>0</Closed_Flag>
    </accountitem>
    <accountitem>
         <Entry_Date>2011-06-24T00:00:00-05:00</Entry_Date>
         <Contract>4570000010</Contract>
         <Account>0</Account>
         <general_desc>Systematic Withdrawal</general_desc>
         <net>1108.3700</net>
         <gross>1196.5400</gross>
         <Person_Name>WHITEY HOUSE</Person_Name>
         <Last_Name>HOUSE</Last_Name>
         <agent_name>BROWN, JACK</agent_name>
         <Legal_Verb>N</Legal_Verb>
         <Payeename>NONE</Payeename>
         <Closed_Flag>0</Closed_Flag>       
    </accountitem>
    <accountitem>
         <Entry_Date>2011-06-20T00:00:00-05:00</Entry_Date>
         <Contract>4570000009</Contract>
         <Account>0</Account>
         <general_desc>Systematic Withdrawal</general_desc>
         <net>798.4038</net>
         <gross>901.5600</gross>
         <Person_Name>WHITEY HOUSE</Person_Name>
         <Last_Name>HOUSE</Last_Name>
         <agent_name>BROWN, JACK</agent_name>
         <Legal_Verb>N</Legal_Verb>
         <Payeename>NONE</Payeename>
         <Closed_Flag>0</Closed_Flag>
    </accountitem>
    <accountitem>
         <Entry_Date>2011-06-20T00:00:00-05:00</Entry_Date>
         <Contract>4570000009</Contract>
         <Account>0</Account>
         <general_desc>Systematic Withdrawal</general_desc>
         <net>798.4038</net>
         <gross>901.5600</gross>
         <Person_Name>WHITEY HOUSE</Person_Name>
         <Last_Name>HOUSE</Last_Name>
         <agent_name>DUCK, DONALD Q</agent_name>
         <Legal_Verb>N</Legal_Verb>
         <Payeename>NONE</Payeename>
         <Closed_Flag>0</Closed_Flag>
    </accountitem>
    <accountitem>
         <Entry_Date>2011-06-20T00:00:00-05:00</Entry_Date>
         <Contract>4570000009</Contract>
         <Account>0</Account>
         <general_desc>Systematic Withdrawal</general_desc>
         <net>800.3800</net>
         <gross>820.3400</gross>
         <Person_Name>WHITEY HOUSE</Person_Name>
         <Last_Name>HOUSE</Last_Name>
         <agent_name>BROWN, JACK</agent_name>
         <Legal_Verb>N</Legal_Verb>
         <Payeename>NONE</Payeename>
         <Closed_Flag>0</Closed_Flag>
    </accountitem>
    <accountitem>
         <Entry_Date>2011-06-20T00:00:00-05:00</Entry_Date>
         <Contract>4570000009</Contract>
         <Account>0</Account>
         <general_desc>Systematic Withdrawal</general_desc>
         <net>800.3800</net>
         <gross>820.3400</gross>
         <Person_Name>WHITEY HOUSE</Person_Name>
         <Last_Name>HOUSE</Last_Name>
         <agent_name>DUCK, DONALD Q</agent_name>
         <Legal_Verb>N</Legal_Verb>
         <Payeename>NONE</Payeename>
         <Closed_Flag>0</Closed_Flag>
    </accountitem>

显示:无
物主
财务顾问
一般说明
网
总的
收款人

我只选择了适用于转换的XSL部分。有什么想法吗?

这只是一个例子,告诉你如何做你想做的事。这里的要点是应用Meuncian方法进行分组。我已经在转换中最小化了生成的输出,这样您就可以很容易地看到想要的结果得到了

注意XML区分大小写。您当前的
构建不正确

<xsl:stylesheet version="1.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

    <xsl:output indent="yes"/>

    <xsl:key name="k-accounts" match="accountitem" 
        use="concat(Contract,Account,format-number(net, '$#,###.00'),format-number(gross, '$#,###.00'))"/>

    <xsl:template match="so">
        <xsl:apply-templates select="accountitem
            [generate-id()
            = generate-id(key('k-accounts', concat(Contract,Account,format-number(net, '$#,###.00'),format-number(gross, '$#,###.00')))
            [1])]"/>
    </xsl:template>

    <xsl:template match="accountitem">
        <xsl:copy>
            <xsl:copy-of select="Contract|Account|net|gross"/>
            <agent_name>
                <xsl:value-of select="agent_name"/>
                <xsl:apply-templates select="key('k-accounts',
                    concat(Contract,Account,format-number(net, '$#,###.00'),format-number(gross, '$#,###.00')))/agent_name
                    [.!=current()/agent_name]"
                    mode="agent_name"/>
            </agent_name>
        </xsl:copy>
    </xsl:template>

    <xsl:template match="agent_name" mode="agent_name">
        <xsl:value-of select="concat('; ',.)"/>
    </xsl:template>

</xsl:stylesheet>

给定此输入(稍微修改以使其格式良好):


2011-06-24T00:00:00-05:00
4570000010
0
系统性退出
1108.3700
1108.3700
怀特之家酒店
房屋
布朗,杰克
N
没有一个
0
2011-06-24T00:00:00-05:00
4570000010
0
系统性退出
1108.3700
1196.5400
怀特之家酒店
房屋
布朗,杰克
N
没有一个
0
2011-06-20T00:00:00-05:00
4570000009
0
系统性退出
798.4038
901.5600
怀特之家酒店
房屋
布朗,杰克
N
没有一个
0
2011-06-20T00:00:00-05:00
4570000009
0
系统性退出
798.4038
901.5600
怀特之家酒店
房屋
唐老鸭
N
没有一个
0
2011-06-20T00:00:00-05:00
4570000009
0
系统性退出
800.3800
820.3400
怀特之家酒店
房屋
布朗,杰克
N
没有一个
0
2011-06-20T00:00:00-05:00
4570000009
0
系统性退出
800.3800
820.3400
怀特之家酒店
房屋
唐老鸭
N
没有一个
0
获得以下输出(最小化以显示获得了正确的结果):

<accountitem>
   <Contract>4570000010</Contract>
   <Account>0</Account>
   <net>1108.3700</net>
   <gross>1108.3700</gross>
   <agent_name>BROWN, JACK</agent_name>
</accountitem>
<accountitem>
   <Contract>4570000010</Contract>
   <Account>0</Account>
   <net>1108.3700</net>
   <gross>1196.5400</gross>
   <agent_name>BROWN, JACK</agent_name>
</accountitem>
<accountitem>
   <Contract>4570000009</Contract>
   <Account>0</Account>
   <net>798.4038</net>
   <gross>901.5600</gross>
   <agent_name>BROWN, JACK; DUCK, DONALD Q</agent_name>
</accountitem>
<accountitem>
   <Contract>4570000009</Contract>
   <Account>0</Account>
   <net>800.3800</net>
   <gross>820.3400</gross>
   <agent_name>BROWN, JACK; DUCK, DONALD Q</agent_name>
</accountitem>

4570000010
0
1108.3700
1108.3700
布朗,杰克
4570000010
0
1108.3700
1196.5400
布朗,杰克
4570000009
0
798.4038
901.5600
布朗,杰克;唐老鸭
4570000009
0
800.3800
820.3400
布朗,杰克;唐老鸭

您需要基于所述连接的组
accountitem
元素。在主组中,还需要更改
代理\u名称
,如所需输出中所示。有关使用标准分组XSLT1.0解决方案实现这一点的方法,请参见我的答案+1.努力和问题。
<xsl:stylesheet version="1.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

    <xsl:output indent="yes"/>

    <xsl:key name="k-accounts" match="accountitem" 
        use="concat(Contract,Account,format-number(net, '$#,###.00'),format-number(gross, '$#,###.00'))"/>

    <xsl:template match="so">
        <xsl:apply-templates select="accountitem
            [generate-id()
            = generate-id(key('k-accounts', concat(Contract,Account,format-number(net, '$#,###.00'),format-number(gross, '$#,###.00')))
            [1])]"/>
    </xsl:template>

    <xsl:template match="accountitem">
        <xsl:copy>
            <xsl:copy-of select="Contract|Account|net|gross"/>
            <agent_name>
                <xsl:value-of select="agent_name"/>
                <xsl:apply-templates select="key('k-accounts',
                    concat(Contract,Account,format-number(net, '$#,###.00'),format-number(gross, '$#,###.00')))/agent_name
                    [.!=current()/agent_name]"
                    mode="agent_name"/>
            </agent_name>
        </xsl:copy>
    </xsl:template>

    <xsl:template match="agent_name" mode="agent_name">
        <xsl:value-of select="concat('; ',.)"/>
    </xsl:template>

</xsl:stylesheet>
<so>
    <accountitem>
        <Entry_Date>2011-06-24T00:00:00-05:00</Entry_Date>
        <Contract>4570000010</Contract>
        <Account>0</Account>
        <general_desc>Systematic Withdrawal</general_desc>
        <net>1108.3700</net>
        <gross>1108.3700</gross>
        <Person_Name>WHITEY HOUSE</Person_Name>
        <Last_Name>HOUSE</Last_Name>
        <agent_name>BROWN, JACK</agent_name>
        <Legal_Verb>N</Legal_Verb>
        <Payeename>NONE</Payeename>
        <Closed_Flag>0</Closed_Flag>
    </accountitem>
    <accountitem>
        <Entry_Date>2011-06-24T00:00:00-05:00</Entry_Date>
        <Contract>4570000010</Contract>
        <Account>0</Account>
        <general_desc>Systematic Withdrawal</general_desc>
        <net>1108.3700</net>
        <gross>1196.5400</gross>
        <Person_Name>WHITEY HOUSE</Person_Name>
        <Last_Name>HOUSE</Last_Name>
        <agent_name>BROWN, JACK</agent_name>
        <Legal_Verb>N</Legal_Verb>
        <Payeename>NONE</Payeename>
        <Closed_Flag>0</Closed_Flag>       
    </accountitem>
    <accountitem>
        <Entry_Date>2011-06-20T00:00:00-05:00</Entry_Date>
        <Contract>4570000009</Contract>
        <Account>0</Account>
        <general_desc>Systematic Withdrawal</general_desc>
        <net>798.4038</net>
        <gross>901.5600</gross>
        <Person_Name>WHITEY HOUSE</Person_Name>
        <Last_Name>HOUSE</Last_Name>
        <agent_name>BROWN, JACK</agent_name>
        <Legal_Verb>N</Legal_Verb>
        <Payeename>NONE</Payeename>
        <Closed_Flag>0</Closed_Flag>
    </accountitem>
    <accountitem>
        <Entry_Date>2011-06-20T00:00:00-05:00</Entry_Date>
        <Contract>4570000009</Contract>
        <Account>0</Account>
        <general_desc>Systematic Withdrawal</general_desc>
        <net>798.4038</net>
        <gross>901.5600</gross>
        <Person_Name>WHITEY HOUSE</Person_Name>
        <Last_Name>HOUSE</Last_Name>
        <agent_name>DUCK, DONALD Q</agent_name>
        <Legal_Verb>N</Legal_Verb>
        <Payeename>NONE</Payeename>
        <Closed_Flag>0</Closed_Flag>
    </accountitem>
    <accountitem>
        <Entry_Date>2011-06-20T00:00:00-05:00</Entry_Date>
        <Contract>4570000009</Contract>
        <Account>0</Account>
        <general_desc>Systematic Withdrawal</general_desc>
        <net>800.3800</net>
        <gross>820.3400</gross>
        <Person_Name>WHITEY HOUSE</Person_Name>
        <Last_Name>HOUSE</Last_Name>
        <agent_name>BROWN, JACK</agent_name>
        <Legal_Verb>N</Legal_Verb>
        <Payeename>NONE</Payeename>
        <Closed_Flag>0</Closed_Flag>
    </accountitem>
    <accountitem>
        <Entry_Date>2011-06-20T00:00:00-05:00</Entry_Date>
        <Contract>4570000009</Contract>
        <Account>0</Account>
        <general_desc>Systematic Withdrawal</general_desc>
        <net>800.3800</net>
        <gross>820.3400</gross>
        <Person_Name>WHITEY HOUSE</Person_Name>
        <Last_Name>HOUSE</Last_Name>
        <agent_name>DUCK, DONALD Q</agent_name>
        <Legal_Verb>N</Legal_Verb>
        <Payeename>NONE</Payeename>
        <Closed_Flag>0</Closed_Flag>
    </accountitem>
</so>
<accountitem>
   <Contract>4570000010</Contract>
   <Account>0</Account>
   <net>1108.3700</net>
   <gross>1108.3700</gross>
   <agent_name>BROWN, JACK</agent_name>
</accountitem>
<accountitem>
   <Contract>4570000010</Contract>
   <Account>0</Account>
   <net>1108.3700</net>
   <gross>1196.5400</gross>
   <agent_name>BROWN, JACK</agent_name>
</accountitem>
<accountitem>
   <Contract>4570000009</Contract>
   <Account>0</Account>
   <net>798.4038</net>
   <gross>901.5600</gross>
   <agent_name>BROWN, JACK; DUCK, DONALD Q</agent_name>
</accountitem>
<accountitem>
   <Contract>4570000009</Contract>
   <Account>0</Account>
   <net>800.3800</net>
   <gross>820.3400</gross>
   <agent_name>BROWN, JACK; DUCK, DONALD Q</agent_name>
</accountitem>