我正在尝试使用XSL文件将XML属性的特定元素移动到特定位置。
假设我有XML
<all>
<one>Something 1</one>
<check>
<present>
<target> Hello </target>
<abc> ABC </abc>
</present>
<absent>
<target> Hi </target>
<pqr> PQR </pqr>
</absent>
</check>
<action>
<perform>
<one>One</one>
<two>Two</two>
</perform>
</action>
</all>
我想要这样的输出:
<all>
<one>Something 1</one>
<check>
<present>
<abc> ABC </abc>
</present>
<absent>
<target> Hi </target>
<pqr> PQR </pqr>
</absent>
</check>
<action>
<perform>
<one>One</one>
<two>Two</two>
<target> Hello </target>
</perform>
</action>
</all>
我写
<xsl:template match= "@*|node()" >
<xsl:copy>
<xsl:apply-templates select= "@*|node()" />
</xsl:copy>
</xsl:template >
<xsl:template match= "action" >
<xsl:copy>
<xsl:apply-templates select= "@*|node()" />
<xsl:apply-templates select= "../check/present/target" mode= "move" />
</xsl:copy>
</xsl:template >
<xsl:template match="target" mode="move">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<target>Hello</target>
移动到<action>
下但我想让它移动到<perform>
内也就是<action>
内
如果您想将target
节点放在perform
下,只需将模板匹配更改为匹配perform
而不是action
<xsl:template match="action/perform">
或者甚至这个(如果perform
只能在action
下)
<xsl:template match="perform">
此外,由于您实际上没有移动节点,而是添加一个新节点,并删除一个现有节点,因此您还需要一个模板来忽略当前的target
节点
<xsl:template match="present/target" />
试试这个XSLT。请注意,我是如何将标识模板作为命名模板来避免一些代码重复的。
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="xml" indent="yes" />
<xsl:template match="@*|node()" name="identity">
<xsl:copy>
<xsl:apply-templates select= "@*|node()" />
</xsl:copy>
</xsl:template>
<xsl:template match="present/target" />
<xsl:template match="action/perform">
<xsl:copy>
<xsl:apply-templates select= "@*|node()" />
<xsl:apply-templates select= "../../check/present/target" mode="move" />
</xsl:copy>
</xsl:template >
<xsl:template match="target" mode="move">
<xsl:call-template name="identity" />
</xsl:template>
</xsl:stylesheet>
当然,如果您不打算修改target
元素,您可以直接使用xsl:copy-of
Try this too
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="xml" indent="yes" />
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select= "@*|node()" />
</xsl:copy>
</xsl:template>
<xsl:template match="present/target" />
<xsl:template match="perform">
<xsl:copy>
<xsl:apply-templates select= "@*|node()" />
<xsl:copy-of select= "../../check/present/target" />
</xsl:copy>
</xsl:template>
</xsl:stylesheet>