XSLT一级分组

时间:2017-02-02 19:20:35

标签: xslt xslt-grouping muenchian-grouping

INPUT:

<Root>
<line id="1">
    <subline name="id">23</subline>
    <subline name="text">mic</subline>
    <subline name="Available">yes</subline>
    <subline name="Unavailable"/>
</line>
<line id="2">
    <subline name="id">23</subline>
    <subline name="text">XrJ</subline>
    <subline name="Available"/>
    <subline name="Unavailable">yes</subline>
</line>
<line id="3">
    <subline name="id">23</subline>
    <subline name="text">mare</subline>
    <subline name="Available"/>
    <subline name="Unavailable">yes</subline>
</line>
<line id="4">
    <subline name="id">574</subline>
    <subline name="text">mic</subline>
    <subline name="Available">yes</subline>
    <subline name="Unavailable"/>
</line>
<line id="5">
    <subline name="id">574</subline>
    <subline name="text">centrer</subline>
    <subline name="Available">yes</subline>
    <subline name="Unavailable"/>
</line>
</Root>

期望的输出:

<Root>
<update>
    <id>23</id>
    <reqUpdate>
        <diff>
            <text>mic</text>
            <available>yes</available>
        </diff>
        <diff>
            <text>XrJ</text>
            <unavailable>yes</unavailable>
        </diff>
        <diff>
            <text>mare</text>
            <unavailable>yes</unavailable>
        </diff>
    </reqUpdate>
</update>
<update>
    <id>574</id>
    <reqUpdate>
        <diff>
            <text>mic</text>
            <available>yes</available>
        </diff>
        <diff>
            <text>centrer</text>
            <available>yes</available>
        </diff>
    </reqUpdate>
</update>
</Root>

我的愿望是,每个唯一的ID可以构建不同的&#34; DIFF&#34;带有子行&#39; TEXT&#39;的值的标签并添加该文本是否可用或不可用,因为您可以看到我们在子行中有这些信息 - &#39;可用&#39; /&#39;不可用&#39;

因此,对于&#34; DIFF&#34;中的每个唯一ID标签应该包含来自文本(来自每个记录)和标签&#34;可用&#34;的值。或&#34;不可用&#34;使用text = YES。

我似乎无法掌握如何做这样的事情,我所做的每一个xsl都没有返回,所以我放弃了,现在我被卡住了。

请帮助并非常感谢帮助一个菜鸟。

编辑:

MY XSL:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="xml"/>
<xsl:key name="record" match="line" use="subline[@name='id']"/>
<xsl:template match="Root">
    <Root>
        <xsl:for-each select="line[generate-id(.)=
  generate-id(key('record',subline[@name='id'])[1])]">
            <update>
                <id>
    <xsl:value-of select="subline   [@name='id']"/>
                </id>
                <reqUpdate>
                    <xsl:variable name="values" select="key('record',subline[@name='id'])/subline[@name='Available']"/>
                    <xsl:choose>
                        <xsl:when test="$values">
                            <xsl:for-each select="$values">
                                <dif>
                                    <text>
                                        <xsl:value-of select="./subline[name='text']"/>
                                    </text>
                                    <available>yes</available>
                                </dif>
                            </xsl:for-each>
                        </xsl:when>
                        <xsl:when test="not($values)">
                            <xsl:for-each select="$values">
                                <dif>
                                    <text>
                                        <xsl:value-of select="./subline[name='text']"/>
                                    </text>
                                    <unavailable>yes</unavailable>
                                </dif>
                            </xsl:for-each>
                        </xsl:when>
                    </xsl:choose>
                </reqUpdate>
            </update>
        </xsl:for-each>
    </Root>
</xsl:template>
</xsl:stylesheet>

我目前的输出:

enter code here
    <Root>
<update>
    <id>23</id>
    <reqUpdate>
        <dif>
            <text/>
            <available>yes</available>
        </dif>
        <dif>
            <text/>
            <available>yes</available>
        </dif>
        <dif>
            <text/>
            <available>yes</available>
        </dif>
    </reqUpdate>
</update>
<update>
    <id>574</id>
    <reqUpdate>
        <dif>
            <text/>
            <available>yes</available>
        </dif>
        <dif>
            <text/>
            <available>yes</available>
        </dif>
    </reqUpdate>
</update>
</Root>

1 个答案:

答案 0 :(得分:0)

我建议你这样做:

XSLT 1.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:strip-space elements="*"/>

<xsl:key name="record" match="line" use="subline[@name='id']"/>

<xsl:template match="/Root">
    <Root>
        <xsl:for-each select="line[generate-id(.)=generate-id(key('record',subline[@name='id'])[1])]">
            <update>
                <id>
                    <xsl:value-of select="subline[@name='id']"/>
                </id>
                <reqUpdate>
                    <xsl:for-each select="key('record', subline[@name='id'])">
                        <diff>
                            <text>
                                <xsl:value-of select="subline[@name='text']"/>
                            </text>
                            <xsl:if test="subline[@name='Available']='yes'">
                                <available>yes</available>
                            </xsl:if>
                           <xsl:if test="subline[@name='Unavailable']='yes'">
                                <unavailable>yes</unavailable>
                            </xsl:if>
                        </diff>
                    </xsl:for-each>
                </reqUpdate>
            </update>
        </xsl:for-each>
    </Root>
</xsl:template>

</xsl:stylesheet>

P.S。恕我直言,目标结构不是最优的;我希望有一个节点具有常量名称(例如available)并更改内容(例如yesno) 。你现在拥有它的方式与原始处理一样尴尬。