XSLT1.0条件分组

XSLT1.0条件分组,xslt,Xslt,在源xml中,我有一个lines元素,包含N个line元素。 每个line元素都有一个groupid和一个lineNo元素。lineNo是唯一的整数值 我还有一个groups元素,包含M个group元素。 对于行元素中每个不同的groupid,我只有一个group元素,因此groupid在group元素中是唯一的 现在,我想以某种方式转换xml,将数据从group元素添加到相应的line元素,但仅添加到该groupid具有min.lineNo的line元素 XSLT1.0可以做到这一点吗? 请参

在源xml中,我有一个lines元素,包含N个line元素。 每个line元素都有一个groupid和一个lineNo元素。lineNo是唯一的整数值

我还有一个groups元素,包含M个group元素。 对于行元素中每个不同的groupid,我只有一个group元素,因此groupid在group元素中是唯一的

现在,我想以某种方式转换xml,将数据从group元素添加到相应的line元素,但仅添加到该groupid具有min.lineNo的line元素

XSLT1.0可以做到这一点吗? 请参见下面的示例XML

多谢各位& 致意

托拜厄斯

下面是一个简化的输入:

<test>
    <lines>
        <line>
            <groupid>1</groupid>
            <lineNo>1</lineNo>
        </line>
        <line>
            <groupid>1</groupid>
            <lineNo>2</lineNo>
        </line>
        <line>
            <groupid>1</groupid>
            <lineNo>3</lineNo>
        </line>        
        <line>
            <groupid>2</groupid>
            <lineNo>4</lineNo>
        </line>
        <line>
            <groupid>2</groupid>
            <lineNo>5</lineNo>
        </line>
    </lines>
    <groups>
        <group>
            <groupid>1</groupid>
            <groupTotal>100</groupTotal>
        </group>
        <group>
            <groupid>2</groupid>
            <groupTotal>200</groupTotal>
        </group>        
    </groups>
</test>

1.
1.
1.
2.
1.
3.
2.
4.
2.
5.
1.
100
2.
200
这里是预期的结果

<test2>
    <lines>
        <line>
            <groupid>1</groupid>
            <lineNo>1</lineNo>
            <groupTotal>100</groupTotal>
        </line>
        <line>
            <groupid>1</groupid>
            <lineNo>2</lineNo>
            <groupTotal/>
        </line>
        <line>
            <groupid>1</groupid>
            <lineNo>3</lineNo>
            <groupTotal/>
        </line>        
        <line>
            <groupid>2</groupid>
            <lineNo>4</lineNo>
            <groupTotal>200</groupTotal>
        </line>
        <line>
            <groupid>2</groupid>
            <lineNo>5</lineNo>
            <groupTotal/>
        </line>
    </lines>
</test2>

1.
1.
100
1.
2.
1.
3.
2.
4.
200
2.
5.

这里有一种方法来看待它:

XSLT1.0

<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"/>

<xsl:key name="line-by-group" match="line" use="groupid" />

<xsl:template match="/">
    <test2>
        <lines>
            <xsl:for-each select="test/groups/group">
                <xsl:apply-templates select="key('line-by-group', groupid)">
                    <xsl:with-param name="total" select="groupTotal"/>
                </xsl:apply-templates>
            </xsl:for-each>
        </lines>    
    </test2>
</xsl:template>

<xsl:template match="line">
    <xsl:param name="total"/>
    <xsl:copy>
        <xsl:copy-of select="groupid | lineNo"/>
        <xsl:if test="position()=1">
            <groupTotal><xsl:value-of select="$total"/></groupTotal>
        </xsl:if>
    </xsl:copy>
</xsl:template>

</xsl:stylesheet>
<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"/>

<xsl:key name="group" match="group" use="groupid" />

<xsl:template match="/">
    <test2>
        <lines>
            <xsl:for-each select="test/lines/line">
                <xsl:copy>
                    <xsl:copy-of select="groupid | lineNo"/>
                    <xsl:if test="not(groupid=preceding-sibling::line[1]/groupid)">
                        <groupTotal>
                            <xsl:value-of select="key('group', groupid)/groupTotal"/>
                        </groupTotal>
                    </xsl:if>
                </xsl:copy>
            </xsl:for-each>
        </lines>    
    </test2>
</xsl:template>

</xsl:stylesheet>


下面是另一个(假设行按组排序):

XSLT1.0

<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"/>

<xsl:key name="line-by-group" match="line" use="groupid" />

<xsl:template match="/">
    <test2>
        <lines>
            <xsl:for-each select="test/groups/group">
                <xsl:apply-templates select="key('line-by-group', groupid)">
                    <xsl:with-param name="total" select="groupTotal"/>
                </xsl:apply-templates>
            </xsl:for-each>
        </lines>    
    </test2>
</xsl:template>

<xsl:template match="line">
    <xsl:param name="total"/>
    <xsl:copy>
        <xsl:copy-of select="groupid | lineNo"/>
        <xsl:if test="position()=1">
            <groupTotal><xsl:value-of select="$total"/></groupTotal>
        </xsl:if>
    </xsl:copy>
</xsl:template>

</xsl:stylesheet>
<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"/>

<xsl:key name="group" match="group" use="groupid" />

<xsl:template match="/">
    <test2>
        <lines>
            <xsl:for-each select="test/lines/line">
                <xsl:copy>
                    <xsl:copy-of select="groupid | lineNo"/>
                    <xsl:if test="not(groupid=preceding-sibling::line[1]/groupid)">
                        <groupTotal>
                            <xsl:value-of select="key('group', groupid)/groupTotal"/>
                        </groupTotal>
                    </xsl:if>
                </xsl:copy>
            </xsl:for-each>
        </lines>    
    </test2>
</xsl:template>

</xsl:stylesheet>