2014-11-02 8 views
0

У меня есть этот XML:XSL группы тегов в родителей группы

<Row> 
     <one>1</one> 
     <two>2</two> 
     <three>3</tree> 
     <four>4</four> 
     <five>5</five> 
     <six>6</six> 
     <seven>7</seven> 
     <... 
     <... 
     <... 
     <... 
     <... 
</Row> 

, и я хочу, чтобы сгруппировать один два тега в основной тег и все остальное (может быть более ста из них) в другой тег:

Ожидаемый результат:

<Row> 

    <main> 
     <one>1</one> 
     <two>2</two> 
    <main> 

    <others> 
     <three>3</tree> 
     <four>4</four> 
     <five>1</five> 
     <six>2</six> 
     <seven>3</seven> 
     <... 
     <... 
     <... 
     <... 
     <... 
    <others> 

</Row> 

Мой XSLT является:

<?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" omit-xml-declaration="yes" encoding="UTF-8" indent="yes"/> 
     <xsl:template match="node()|@*"> 
      <xsl:copy> 
       <xsl:apply-templates select="node()|@*"/> 
      </xsl:copy> 
     </xsl:template> 


     <xsl:template match="Row"> 

      <main> 
      <xsl:apply-templates select="one|two"/> 
      </main> 

      <others> 
      <xsl:apply-templates select="node()|@*"/> 
      </others> 

     </xsl:template> 

Но я нахожусь на другом теге тоже один и два, я хочу, чтобы один и два были только в основном теге.

+1

Пожалуйста, не оставляйте тот же вопрос несколько раз. http://stackoverflow.com/questions/26699292/xsl-grouping-tags-into-parent –

ответ

0

Вы применяете шаблоны дважды на одном и двух. Сначала явно, во-вторых, неявно во втором совпадении: node() | @ *. Просто отфильтруйте их из этого второго матча. Этот XPath должен делать эту работу (не проверял, слишком рано утром здесь для меня):

<xsl:template match="Row"> 

     <main> 
     <xsl:apply-templates select="one|two"/> 
     </main> 

     <others> 
     <!-- No need to apply on attributes (@*), 
     unless you explicitely want to add rows attributes to others element.--> 
     <xsl:apply-templates select="node()[not(name()='one' or name()='two')]"/> 
     </others> 

    </xsl:template> 
Смежные вопросы