如何在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>
我需要通过 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>