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>

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

4

2 回答 2

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>
于 2013-05-08T04:53:35.467 回答
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

对于您提出的问题的复杂结果 - 使用此 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>
于 2013-05-08T05:34:13.223 回答