2012-07-24 69 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>