如何使用XSLT移动特定的XML元素



我正在尝试使用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>

相关内容

  • 没有找到相关文章

最新更新