0

私は初心者です。XSLT ヘルプが必要です: 雇用主は n 個の数にすることができます。従業員は n 人まで指定できます。重複を見つける必要はありません。これがソースxmlです。ソース:

<?xml version="1.0" encoding="UTF-8"?>
<root>
    <employer name="one">
        <employee name="1"/>
        <employee name="2"/>
    </employee>
    <employer name="one">
        <employee name="1"/>
        <employee name="2"/>
    </employee>
    <employer name="two">
        <employee name="1"/>
        <employee name="2"/>
    </employee>
    <employer name="three">
        <employee name="1"/>
        <employee name="2"/>
    </employee> 
</root>

必要な出力

<root>
    <employer name="one">
        <employee name="1"/>
        <employee name="2"/>
        <employee name="1"/>
        <employee name="2"/>
    </employee>
    <employer name="two">
        <employee name="1"/>
        <employee name="2"/>
    </employee>
    <employer name="three">
        <employee name="1"/>
        <employee name="2"/>
    </employee> 
</root>
4

2 に答える 2

0

よりシンプルで効率的なソリューションとして、Muenchian グループ化とプッシュ スタイルを使用します。

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

<xsl:key name="emp" match="employer" use="@name" />

<xsl:template match="/">
 <root>
   <xsl:apply-templates select="/*/employer[
   generate-id(.) = generate-id( key('emp',@name)[1])]"/>
 </root>
</xsl:template>

<xsl:template match="employer">
 <xsl:copy>
   <xsl:copy-of select="@* | key('emp',@name)/*" />
 </xsl:copy>
</xsl:template>

</xsl:stylesheet>
于 2012-07-24T08:52:16.087 に答える
0

固定 XML ソース ファイルを使用すると、次のようになります。

<xsl:template match="/root">
    <root>
        <xsl:for-each select="employer">
            <xsl:variable name="name" select="@name"/>
            <xsl:if test="not(preceding-sibling::employer[@name=$name])">
                <employer name="{@name}">
                    <xsl:for-each select="/root/employer[@name=$name]/employee">
                        <employee name="{@name}"/>
                    </xsl:for-each>
                </employer>
            </xsl:if>
        </xsl:for-each>            
    </root>
</xsl:template>

あなたが欲しかったものをあなたに与えます。または、あなたが望むものだと思います-実際に必要な出力は有効なXMLではないので、雇用主を閉鎖する従業員と一致させるつもりはなかったと思いますか?

<?xml version="1.0" encoding="utf-8"?>
<root>
    <employer name="one">
        <employee name="1"/>
        <employee name="2"/>
        <employee name="1"/>
        <employee name="2"/>
    </employer>
    <employer name="two">
        <employee name="1"/>
        <employee name="2"/>
    </employer>
    <employer name="three">
        <employee name="1"/>
        <employee name="2"/>
    </employer>
</root>
于 2012-07-24T08:26:15.513 に答える