将子子项添加到元素中

时间:2013-05-08 04:43:24

标签: xslt nodes

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>

创建一个新元素并传递子节点的剩余所有子子节点。

2 个答案:

答案 0 :(得分: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>

答案 1 :(得分:0)

对于我们的XML文件,您可以使用此XSLT模式获取结果,就像您一样(在浏览器中使用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 make result,如问题所示 - 使用此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>