如何在xslt中的特定元素之后复制元素

How to copy element after specific element in xslt

我需要通过 XSLT 1.0 g, h 从 //element/part[1] 复制到 //element/part[2],但我需要粘贴它并在给定元素后复制 'f'。我有这个 XML:

<root>
<element>
    <part>
        <a>1</a>
        <b>2</b>
        <c>3</c>
        <f>4</f>
        <g>5</g>
        <h>6</h>
        <z>50</z>
    </part>
</element>

<element>
    <part>
        <a>1</a>
        <b>2</b>
        <c>3</c>
        <f>4</f>
        <z>55</z>
    </part>
</element>

我需要将 g, h 从 //element/part[1] 复制到 //element/part[2] - 但我需要根据名称元素复制它,因为 XML 是动态的,可以在 f 之前包含 d、e,所以我不能通过索引位置粘贴它。那么我应该如何实现这个XML

<root>
<element>
    <part>
        <a>1</a>
        <b>2</b>
        <c>3</c>
        <f>4</f>
        <g>5</g>
        <h>6</h>
        <z>50</z>
    </part>
</element>

<element>
    <part>
        <a>1</a>
        <b>2</b>
        <c>3</c>
        <f>4</f>
        <g>5</g>
        <h>6</h>
        <z>55</z>
    </part>
</element>

我有这个 xsl 文件,但它在 'z'

之后复制了它
<xsl:stylesheet version="1.0"
            xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
            >

<xsl:strip-space  elements="*"/>
<xsl:output omit-xml-declaration="no" indent="yes"/>


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

<xsl:template match="//root/element[2]/part">
    <xsl:copy>
        <xsl:apply-templates select="@* | node()"/>
        <xsl:if test="not(g)">
            <xsl:copy-of select="../../element[1]/part/g"/>
        </xsl:if>
        <xsl:if test="not(h)">
            <xsl:copy-of select="../../element[1]/part/h"/>
        </xsl:if>
    </xsl:copy>
</xsl:template>

如果元素 f 将始终出现在 element[2]/part 中,那么您可以这样做:

XSLT 1.0

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:strip-space elements="*"/>

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

<xsl:template match="element[2]/part/f">
    <xsl:copy-of select="."/>
    <xsl:if test="not(../g)">
        <xsl:copy-of select="../../../element[1]/part/g"/>
    </xsl:if>
    <xsl:if test="not(../h)">
        <xsl:copy-of select="../../../element[1]/part/h"/>
    </xsl:if>
</xsl:template>

</xsl:stylesheet>