0

我是新手。需要 XSLT 帮助:Employer 可以是 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

使用固定的 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 回答
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 回答