xslt:将子节点移动到父节点

时间:2013-08-01 08:57:56

标签: xslt

我的目标是允许访问元素“p”的某些属性(作为新的子元素),同时将其余的原始内容放到新的兄弟孩子“p1”中,然后返回编辑后的原始结构已经完成。

所以原始节点看起来像这样:

<p attr1="..." attr2="..." moreattr1="..." moreattr2="...">...content,more nodes,etc...</p>

我的“可编辑”结构是:

<p>
   <attr1edit value="...">
   <attr2edit value="...">
   <p1 moreattr1="..." moreattr2="...">...content,more nodes...</p1>
</p>

“p1”现在已经占用了前“p”的所有内容,除了前导属性元素。

当我尝试回到原始结构时,我陷入困境:

我可以将属性(attr1,attr2)与其他属性一起放回“p1”,但后来我不知道如何将“p1”的整个内容交换回“p”并删除“p1”,或删除“p”并将“p1”重命名为“p”(这将使节点向上移动一步)。 如何才能做到这一点? 非常感谢 - 克里斯

1 个答案:

答案 0 :(得分:2)

样式表

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

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

<xsl:template match="p">
  <xsl:copy>
    <xsl:apply-templates select="*[not(self::p1)] | p1/@*"/>
    <xsl:apply-templates select="p1/node()"/>
  </xsl:copy>
</xsl:template>

<xsl:template match="p/*">
  <xsl:attribute name="{substring-before(name(), 'edit')}">
    <xsl:value-of select="@value"/>
  </xsl:attribute>
</xsl:template>

</xsl:stylesheet>

变换

<p>
   <attr1edit value="..."/>
   <attr2edit value="..."/>
   <p1 moreattr1="..." moreattr2="...">...content,more nodes...</p1>
</p>

<p attr1="..." attr2="..." moreattr1="..." moreattr2="...">...content,more nodes...</p>