2013-05-08 97 views
0

headerchild元素是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

用于Y我们的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 

对于complite使您的问题的结果 - 使用此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>