2014-12-04 1 views
1

я должен перегруппировать элементы XML в одной и той же структуры XML, основанные на атрибутах У меня есть XML, как этотИзменение структуры XML с помощью группирования XML-элементы на основе атрибута

<a> 
    <b> 
     <c> 
      <d1 att2="t1">test 1</d1> 
      <d1>test 2</d1> 
      <d1>test 3</d1> 
      <d1 att2="t1">test 4</d1> 
     </c> 
    </b> 
</a> 

Мне нужно CONVER этот XML до,

<a> 
    <b> 
     <c> 
      <d1 att2="t1">test 1</d1> 
      <d1 att2="t1">test 4</d1> 
     </c> 
    </b> 
</a> 
<a> 
    <b> 
     <c> 
      <d1>test 2</d1> 
     </c> 
    </b> 
</a> 
<a> 
    <b> 
     <c> 
      <d1>test 3</d1> 
     </c> 
    </b> 
</a> 
+0

Чтобы подтвердить, что если 'att2' - то же самое, тогда группируйте их, но если они разные или отсутствуют, то новая группа? Вы получаете доступ к процессору xslt 2? Пожалуйста, пометьте как таковой? – StuartLC

+0

@StuartLC Ваше предположение верно, и у меня есть доступ к процессору xslt 2. – chavsh

ответ

0

Это действительно невдохновленный/ручной труд, но, похоже, он выполнил свою работу. Шаблон применяет отдельные ветви к элементам с атрибутами @att2 и без них.

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 

    <xsl:template match="/"> 
     <root> 
      <xsl:for-each-group select="//d1[@att2]" group-by="@att2"> 
       <a> 
        <b> 
         <c> 
          <xsl:for-each select="current-group()"> 
           <xsl:apply-templates select="." mode="nowrapper"></xsl:apply-templates> 
          </xsl:for-each> 
         </c> 
        </b> 
       </a> 
      </xsl:for-each-group> 
      <xsl:apply-templates select="//d1[not(@att2)]" mode="wrapper" /> 
     </root> 
    </xsl:template> 

    <xsl:template match="d1" mode="wrapper"> 
     <a> 
      <b> 
       <c> 
        <xsl:apply-templates select="." mode="nowrapper" /> 
       </c> 
      </b> 
     </a> 
    </xsl:template> 

    <xsl:template match="d1" mode="nowrapper"> 
     <xsl:copy-of select="." /> 
    </xsl:template> 

</xsl:stylesheet> 
+0

Спасибо @StuartLC за вашу помощь. – chavsh

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