2012-05-31 3 views
1

Я работаю с XSLT, где источник выглядит так.Группирование одинаковых тегов под элементом в xslt

Источник:

 <Data> 
      <AB>all</AB> 
      <AB>all2</AB> 
      <CD>hhhhhh</CD> 
      <DE>hhhshhh</DE>     
     </Data> 

Нужно написать XSLT, чтобы получить выход в

<Info> 
     <XXX> 
     <TTT value="all"/> 
     <TTT value="all2"/> 
     </XXX> 
    <!-- ....--> 
    <!-- ..to het all the elements.. --> 

    </Info> 

Я должен написать XSLT, чтобы соответствовать тег.

<xsl:template match="AB"> 


    </xsl:template> 

Я могу это сделать, сопоставляя тег данных.

<?xml version="1.0" encoding="utf-8"?> 
    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
     <xsl:output method="xml" indent="yes"/> 

     <xsl:template match="Data"> 
     <info> 
      <XXX> 
      <xsl:for-each select="AB"> 
      <TTT> 
      <xsl:attribute name="value"> 
      <xsl:value-of select="."/> 
      </xsl:attribute> 
      </TTT> 
      </xsl:for-each> 
      </XXX> 
     </info> 
      </xsl:template> 

    </xsl:stylesheet> 

Может ли один помочь мне, как это сделать путем сопоставления AB тег

<xsl:template match="AB"> 


    </xsl:template> 

спасибо.

ответ

0

Я думаю, вы спрашиваете, как вы используете xsl: apply-templates. Если да, то ваш XSLT будет выглядеть следующим образом

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output method="xml" indent="yes"/> 

    <xsl:template match="Data"> 
     <info> 
     <XXX> 
      <xsl:apply-templates select="AB"/> 
     </XXX> 
     </info> 
    </xsl:template> 

    <xsl:template match="AB"> 
     <TTT value="{.}"/> 
    </xsl:template> 
</xsl:stylesheet> 

Не стоит также отметить использование атрибутов шаблонов Значение в AB шаблон упростить XSLT.

Если вы также требуете других элементов, не AB для вывода без изменений, вы бы использовать единицы преобразования в вашем XSLT

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output method="xml" indent="yes"/> 

    <xsl:template match="Data"> 
     <info> 
     <XXX> 
      <xsl:apply-templates select="AB"/> 
     </XXX> 
     <xsl:apply-templates select="node()[not(self::AB)]" /> 
     </info> 
    </xsl:template> 
    <xsl:template match="AB"> 
     <TTT value="{.}"/> 
    </xsl:template> 

    <xsl:template match="@*|node()"> 
     <xsl:copy> 
      <xsl:apply-templates select="@*|node()"/> 
     </xsl:copy> 
    </xsl:template> 
</xsl:stylesheet> 

Это также соответствует всем элементам, не AB, outputing следуя XXX. В вашем случае, это будет выход следующее:

<info> 
    <XXX> 
     <TTT value="all" /> 
     <TTT value="all2" /> 
    </XXX> 
    <CD>hhhhhh</CD> 
    <DE>hhhshhh</DE> 
</info> 

Конечно, нет никаких причин, вы не могли бы иметь другие элементы шаблонов соответствия, как CD или DE, чтобы превратить их тоже.

+0

Благодарим вас за отличный ответ. – Patan

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