2013-05-08 4 views
0

Элементы header и child являются дочерними числами parent. Могу ли я сохранить header и его детей как есть, а оставшиеся subchild узлы child должны быть добавлены к новому элементу?Добавить ребенка ребенка в элемент

<parent> 
    <header> 
     <left></left> 
     <right></right> 
    </header> 
    <child> 
     <subchild></subchild> 
     <subchild></subchild> 
     <subchild></subchild> 
    </child> 
    <child> 
     <subchild></subchild> 
     <subchild></subchild> 
    </child> 
    <child> 
     <subchild></subchild> 
     <subchild></subchild> 
     <subchild></subchild> 
    </child> 
</parent> 

Есть ли способ, которым я могу сгенерировать выходной сигнал ниже?

<parent> 
    <header> 
     <left></left> 
     <right></right> 
    </header> 
    <element> 
     <subchild></subchild> 
     <subchild></subchild> 
     <subchild></subchild> 
     <subchild></subchild> 
     <subchild></subchild> 
     <subchild></subchild> 
     <subchild></subchild> 
     <subchild></subchild> 
    </element> 
</parent> 

Создайте новый элемент и пропустите оставшиеся дочерние узлы дочернего элемента.

ответ

0

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

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

    <xsl:strip-space elements="*"/> 
    <xsl:output method="xml" indent="yes" encoding="UTF-8" omit-xml-declaration="yes"/> 

    <xsl:template match="/"> 
     <xsl:apply-templates/> 
    </xsl:template> 

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

    <xsl:template match="child"> 
     <xsl:copy-of select="*"/> 
    </xsl:template> 

</xsl:stylesheet> 

выход

<parent> 
    <header> 
     <left/> 
     <right/> 
    </header> 
    <subchild/> 
    <subchild/> 
    <subchild/> 
    <subchild/> 
    <subchild/> 
    <subchild/> 
    <subchild/> 
    <subchild/> 
</parent> 
0

Для у нашего XML файл, который вы можете использовать эту XSLT схему для получения в результате, как вы wnat (использование HTML для симпатичной смотрите в браузере)

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> 
    <xsl:template match="/"> 
     <html> 
      <head> 
       <title></title> 
      </head> 
      <body> 
       <xsl:apply-templates/> 
      </body> 
     </html> 
    </xsl:template> 
    <xsl:template match="parent"> 
     <div id="parent"> 
      <header> 
       <div id="left"><xsl:value-of select="header/left/text()"/></div> 
       <div id="right"><xsl:value-of select="header/right/text()"/></div> 
      </header> 
      <ul id="elements"> 
       <xsl:for-each select="child/subchild"> 
        <li><xsl:value-of select="text()"/></li> 
       </xsl:for-each> 
      </ul> 
     </div> 

    </xsl:template> 
</xsl:stylesheet> 

Результат выглядит так:

Left block 
Right Block 

    Child 1 - Subchild 1 
    Child 1 - Subchild 2 
    Child 1 - Subchild 3 
    Child 2 - Subchild 1 
    Child 2 - Subchild 2 
    Child 3 - Subchild 1 
    Child 3 - Subchild 2 
    Child 3 - Subchild 3 

Для примера сделайте так же, как в вашем вопросе - используйте этот код XSLT:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> 
    <xsl:template match="/"> 
      <xsl:apply-templates/> 
    </xsl:template> 
    <xsl:template match="parent"> 
     <parent> 
      <xsl:value-of select="header/node()"/> 
      <elements> 
       <xsl:for-each select="child/subchild"> 
        <xsl:value-of select="node()"/> 
       </xsl:for-each> 
      </elements> 
     </parent> 
    </xsl:template> 
</xsl:stylesheet> 

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

  • Нет связанных вопросов^_^