2012-07-24 106 views
0

我是一个新手。需要XSLT帮助:雇主可以是n号码。员工可以是n号。无需查找重复。这是源xml。 来源:XSLT联盟元素

<?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> 
+0

您能够使用XSLT2.0吗? – 2012-07-24 07:45:11

+0

我猜你的最终员工标签应该是雇主标签,否则你的XML无效? – Woody 2012-07-24 08:19:24

回答

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> 
+0

谢谢!如果我们想根据姓名(按字母顺序)对雇主进行分类,该怎么办? – raja 2012-07-24 17:19:35

+0

阅读关于Muenchian分组[这里](http://www.jenitennison.com/xslt/grouping/muenchian.html)。一旦你了解它,你可以应用任何分组条件。阅读关于排序[这里](http://www.xml.com/pub/a/2002/07/03/transform.html)。 – 2012-07-25 00:07:15

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>