2016-06-16 6 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をありがとうこれは、

<?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'を使用してください。 –

関連する問題