带XPath的XSLT - 用新的Parent包装子元素

时间:2015-06-03 19:24:19

标签: xml xslt xpath

输入:

<s:E1 ...>
    <s:E2 ...>
      <s:Child1 ...>
         <s:EChild1 ...>
         ...
         </s:EChild1 ...>
      </s:Child1 ...>
   </s:E2>
</s:E1 ...>

所需的输出是:

<s:E1 ...>
    <s:E2 ...>
      <s:XYZ>
          <s:Child1 ...>
             <s:EChild1 ...>
             ...
             </s:EChild1 ...>
          </s:Child1 ...>
      </s:XYZ>
   </s:E2>
</s:E1 ...>

I.E,我想在<s:E2>中将所有子元素及其属性和子项包裹在<s:XYZ>中。

我提出的XSLT是:

<xsl:stylesheet version="2.0" ...>
<xsl:output indent="yes"/> 
    <xsl:template match="//*:E2">
      <s:XYZ>
        <xsl:apply-templates/>
      </s:XYZ>
    </xsl:template>

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

这有效地生成<s:XYZ>变为<s:E2>但不是其直接子元素的输出。

1 个答案:

答案 0 :(得分:1)

尝试:

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

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