我的目标是允许访问元素“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”(这将使节点向上移动一步)。 如何才能做到这一点? 非常感谢 - 克里斯
答案 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>