2016-06-16 9 views
0

Im новое преобразование 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

Тр 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

Это не очень хороший ответ. Используйте * Muenchian grouping * в XSLT 1.0 и 'xsl: for-each-group' в XSLT 2.0. –

Смежные вопросы