2016-06-16 108 views
0

對於xslt轉換而言,我需要重新組合所有包含相同用戶名的節點,並重新組合與此用戶對應的技能,這裏是一個簡單示例。 輸入:按屬性值對XML節點進行分組

<Rowsets> 
 
    <Rowset> 
 
     <Columns> 
 
      <Column Description="" MaxRange="1" MinRange="0" Name="login" SQLDataType="1" SourceColumn="User_login"/> 
 
      <Column Description="" MaxRange="1" MinRange="0" Name="longName" SQLDataType="1" SourceColumn="User_longName"/> 
 
      <Column Description="" MaxRange="1" MinRange="0" Name="Competency" SQLDataType="1" SourceColumn="Competency"/> 
 
     </Columns> 
 
     <Row> 
 
      <login>NG5E054</login> 
 
      <longName>---</longName> 
 
      <Competency>SKILL1</Competency> 
 
     </Row> 
 
     <Row> 
 
      <login>NG5E059</login> 
 
      <longName>---</longName> 
 
      <Competency>SKILL1</Competency> 
 
     </Row> 
 
     <Row> 
 
      <login>NG5E059</login> 
 
      <longName>---</longName> 
 
      <Competency>SKILL2</Competency> 
 
     </Row> 
 
     <Row> 
 
      <login>NG5E059</login> 
 
      <longName>---</longName> 
 
      <Competency>SKILL3</Competency> 
 
     </Row> 
 

 
    </Rowset> 
 
</Rowsets>

而我所需的輸出是:

<Rowsets> 
 
    <Rowset> 
 
     <Columns> 
 
      <Column Description="" MaxRange="1" MinRange="0" Name="login" SQLDataType="1" SourceColumn="User_login"/> 
 
      <Column Description="" MaxRange="1" MinRange="0" Name="longName" SQLDataType="1" SourceColumn="User_longName"/> 
 
      <Column Description="" MaxRange="1" MinRange="0" Name="Competency" SQLDataType="1" SourceColumn="Competency"/> 
 
     </Columns> 
 
     <Row> 
 
      <login>NG5E054</login> 
 
      <longName>---</longName> 
 
      <Competency>SKILL1</Competency> 
 
     </Row> 
 
     <Row> 
 
      <login>NG5E059</login> 
 
      <longName>---</longName> 
 
      <Competency>SKILL1, SKILL2, SKILL3</Competency> 
 
     </Row> 
 
    </Rowset> 
 
</Rowsets>

謝謝

+0

搜索XSLT分組 - 這是這裏最常提到的XSLT問題。請注意,對於XSLT 1.0或2.0,答案是不同的。 –

回答

-1

Tr的y這:

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:template match="/"> 
     <xsl:for-each select="//Row/login[not(.=preceding::*)]"> 
      <xsl:variable name="login" select="."/> 
      <Row> 
       <login><xsl:value-of select="$login"/></login> 
       <Competency> 
        <xsl:for-each select="//Row[login=$login]/Competency"> 
         <xsl:value-of select="."/> 
         <xsl:if test="position() != last()">, </xsl:if> 
        </xsl:for-each> 
       </Competency> 
      </Row> 
     </xsl:for-each> 
    </xsl:template> 
</xsl:stylesheet> 

基本上它會爲每個唯一登錄創建一行。每行內部連接所有相關技能。

這適用於XSLT 1.0和2.0。

+0

它的工作原理!萬分感謝 ! :) –

+1

@MehdiMAHHOU,如果回答適合您的要求,然後勾選正確的標記。 –

+0

這不是一個好的答案。在XSLT 1.0中使用* Muenchian分組*,在XSLT 2.0中使用'xsl:for-each-group'。 –

相關問題