簡體   English   中英

用xsl分組重復的xml數據

[英]grouping repeating xml data with xsl

我有一個XML文件,需要使用XSL轉換為具有相同屬性值名稱(@name)的標簽。 在下面的示例輸入中,唯一的重復值是“ objectClass”。 我似乎找不到其他解決我遇到的問題的帖子。 以下是我的輸入,代碼,當前輸出和所需的輸出。 XSL 2.0對我來說不是一個選擇。

輸入:

<top>
<MPTPartyUserInqMultiLDAPData>
    <DN>cn=BRK001,ou=USERS,ou=INTERNAL,o=UMB</DN>
    <attribute-value name="passwordUniqueRequired">TRUE</attribute-value>
    <attribute-value name="passwordRequired">TRUE</attribute-value>
    <attribute-value name="uid">BRK001</attribute-value>
    <attribute-value name="initials">R</attribute-value>
    <attribute-value name="cn">BRK001</attribute-value>
    <attribute-value name="umbGUID">I00000000001498</attribute-value>
    <attribute-value name="objectClass">inetOrgPerson</attribute-value>
    <attribute-value name="objectClass">umbPerson</attribute-value>
    <attribute-value name="objectClass">organizationalPerson</attribute-value>
    <attribute-value name="objectClass">Person</attribute-value>
    <attribute-value name="objectClass">ndsLoginProperties</attribute-value>
    <attribute-value name="objectClass">Top</attribute-value>
    <attribute-value name="umbCustomer">22586</attribute-value>
</MPTPartyUserInqMultiLDAPData>
<MPTPartyUserInqMultiLDAPData>
    <DN>cn=BRK001,ou=USERS,ou=INTERNAL,o=UMB</DN>
    <attribute-value name="passwordUniqueRequired">TRUE</attribute-value>
    <attribute-value name="passwordRequired">TRUE</attribute-value>
    <attribute-value name="uid">BRK001</attribute-value>
    <attribute-value name="initials">R</attribute-value>
    <attribute-value name="cn">BRK001</attribute-value>
    <attribute-value name="umbGUID">I00000000001498</attribute-value>
    <attribute-value name="objectClass">inetOrgPerson</attribute-value>
    <attribute-value name="objectClass">umbPerson</attribute-value>
    <attribute-value name="objectClass">organizationalPerson</attribute-value>
    <attribute-value name="objectClass">Person</attribute-value>
    <attribute-value name="objectClass">ndsLoginProperties</attribute-value>
    <attribute-value name="objectClass">Top</attribute-value>
    <attribute-value name="umbCustomer">22586</attribute-value>
</MPTPartyUserInqMultiLDAPData>
</top>

當前的XSL:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="xml" indent="yes" encoding="UTF-8" omit-xml-declaration="yes"/>

<xsl:key name="test" match="attribute-value" use="@name"/>

<xsl:template match="@*|node()">
    <xsl:copy>
        <xsl:apply-templates select="@*|node()"/>
    </xsl:copy>
</xsl:template>

<xsl:template match="/">
    <xsl:variable name="ldapMapping">
        <xsl:apply-templates select="@*|node()" />
    </xsl:variable>
    <xsl:copy-of select="$ldapMapping"/>
</xsl:template>

<xsl:template match="//*[local-name()='MPTPartyUserInqMultiLDAPData']">
    <xsl:variable name="ldapFormatted">
    <MPTPartyUserInqMultiLDAPData>
            <entries>
                <xsl:for-each select="attribute-value[count(. | key('test', @name)[1]) = 1]">
                    <attributes>
                        <name>
                            <xsl:value-of select="@name"/>
                        </name>
                        <xsl:for-each select="key('test', @name)">
                            <value>
                                <xsl:value-of select="."/>
                            </value>
                        </xsl:for-each>
                    </attributes>
                </xsl:for-each>
            </entries>
        </MPTPartyUserInqMultiLDAPData>
    </xsl:variable>

    <xsl:copy-of select="$ldapFormatted"/>

</xsl:template>

電流輸出:

<top>
<MPTPartyUserInqMultiLDAPData>
    <entries>
        <attributes>
            <name>passwordUniqueRequired</name>
            <value>TRUE</value>
            <value>TRUE</value>
        </attributes>
        <attributes>
            <name>passwordRequired</name>
            <value>TRUE</value>
            <value>TRUE</value>
        </attributes>
        <attributes>
            <name>uid</name>
            <value>BRK001</value>
            <value>BRK001</value>
        </attributes>
        <attributes>
            <name>initials</name>
            <value>R</value>
            <value>R</value>
        </attributes>
        <attributes>
            <name>cn</name>
            <value>BRK001</value>
            <value>BRK001</value>
        </attributes>
        <attributes>
            <name>umbGUID</name>
            <value>I00000000001498</value>
            <value>I00000000001498</value>
        </attributes>
        <attributes>
            <name>objectClass</name>
            <value>inetOrgPerson</value>
            <value>umbPerson</value>
            <value>organizationalPerson</value>
            <value>Person</value>
            <value>ndsLoginProperties</value>
            <value>Top</value>
            <value>inetOrgPerson</value>
            <value>umbPerson</value>
            <value>organizationalPerson</value>
            <value>Person</value>
            <value>ndsLoginProperties</value>
            <value>Top</value>
        </attributes>
        <attributes>
            <name>umbCustomer</name>
            <value>22586</value>
            <value>22586</value>
        </attributes>
    </entries>
</MPTPartyUserInqMultiLDAPData>
<MPTPartyUserInqMultiLDAPData>
    <entries/>
</MPTPartyUserInqMultiLDAPData>
</top>

所需輸出:

<top>
<MPTPartyUserInqMultiLDAPData>
    <entries>
        <attributes>
            <name>passwordUniqueRequired</name>
            <value>TRUE</value>
        </attributes>
        <attributes>
            <name>passwordRequired</name>
            <value>TRUE</value>
        </attributes>
        <attributes>
            <name>uid</name>
            <value>BRK001</value>
        </attributes>
        <attributes>
            <name>initials</name>
            <value>R</value>
        </attributes>
        <attributes>
            <name>cn</name>
            <value>BRK001</value>
        </attributes>
        <attributes>
            <name>umbGUID</name>
            <value>I00000000001498</value>
        </attributes>
        <attributes>
            <name>objectClass</name>
            <value>inetOrgPerson</value>
            <value>umbPerson</value>
            <value>organizationalPerson</value>
            <value>Person</value>
            <value>ndsLoginProperties</value>
            <value>Top</value>
        </attributes>
        <attributes>
            <name>umbCustomer</name>
            <value>22586</value>
        </attributes>
    </entries>
</MPTPartyUserInqMultiLDAPData>
<MPTPartyUserInqMultiLDAPData>
    <entries>
        <attributes>
            <name>passwordUniqueRequired</name>
            <value>TRUE</value>
        </attributes>
        <attributes>
            <name>passwordRequired</name>
            <value>TRUE</value>
        </attributes>
        <attributes>
            <name>uid</name>
            <value>BRK001</value>
        </attributes>
        <attributes>
            <name>initials</name>
            <value>R</value>
        </attributes>
        <attributes>
            <name>cn</name>
            <value>BRK001</value>
        </attributes>
        <attributes>
            <name>umbGUID</name>
            <value>I00000000001498</value>
        </attributes>
        <attributes>
            <name>objectClass</name>
            <value>inetOrgPerson</value>
            <value>umbPerson</value>
            <value>organizationalPerson</value>
            <value>Person</value>
            <value>ndsLoginProperties</value>
            <value>Top</value>
        </attributes>
        <attributes>
            <name>umbCustomer</name>
            <value>22586</value>
        </attributes>
    </entries>
</MPTPartyUserInqMultiLDAPData>
</top>

如果我只有一個MPTPartyUserInqMultiLDAPData分組,則標記會正確分組,但是當我有多個迭代時,它將如上圖所示將它們分組在一起,這是我不想要的。 我知道為什么這樣做,但無法弄清楚如何將分組保留在MPTPartyUserInqMultiLDAPData標記內。

認為您想執行以下操作:

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:key name="attr" match="attribute-value" use="concat(@name, '|', generate-id(..))"/>

<xsl:template match="/top">
    <xsl:copy>
        <xsl:apply-templates select="MPTPartyUserInqMultiLDAPData"/>
    </xsl:copy>
</xsl:template>

<xsl:template match="MPTPartyUserInqMultiLDAPData">
    <xsl:copy>
        <entries>
            <xsl:for-each select="attribute-value[count(. | key('attr', concat(@name, '|', generate-id(..)))[1])=1]">
                <attributes>
                    <name>
                        <xsl:value-of select="@name"/>
                    </name>
                    <xsl:for-each select="key('attr', concat(@name, '|', generate-id(..)))">
                        <value>
                            <xsl:value-of select="."/>
                        </value>
                    </xsl:for-each>
                </attributes>
            </xsl:for-each>
        </entries>
    </xsl:copy>
</xsl:template>

</xsl:stylesheet>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM