XSLT1.0复制所有节点并添加一些类似的节点



我有一个xml,我想添加一些元素,但不影响其他已经存在的元素。元素的顺序并不重要。但是有一个新元素没有加入,如何解决?

输入XML

<?xml version="1.0" encoding="utf-8"?>
<root>
<InterchangeHeader>InterchangeHeader</InterchangeHeader>
<SG0>
<UNH>UNH</UNH>
<BGM>BGM</BGM>
<DTM>DTM</DTM>
<SG26>
<LIN>
<E1082>000010</E1082>
<C212>
<E7143>SRV</E7143>
</C212>
</LIN>
<PIA>
<E4347>1</E4347>
<C212>
<E7140>000010</E7140>
<E7143>IN</E7143>
</C212>
</PIA>
<QTY>
<C186>
<E6063>21</E6063>
<E6060>2100.000</E6060>
<E6411>EA</E6411>
</C186>
</QTY>
<QTY>
<C186>
<E6063>170</E6063>
<E6060>2100.000</E6060>
<E6411>EA</E6411>
</C186>
</QTY>
</SG26>
<SG26>
<LIN>
<E1082>000020</E1082>
<C212>
<E7143>SRV</E7143>
</C212>
</LIN>
<PIA>
<E4347>1</E4347>
<C212>
<E7140>000020</E7140>
<E7143>IN</E7143>
</C212>
</PIA>
<QTY>
<C186>
<E6063>21</E6063>
<E6060>2100.000</E6060>
<E6411>EA</E6411>
</C186>
</QTY>
<QTY>
<C186>
<E6063>170</E6063>
<E6060>0.000</E6060>
<E6411>EA</E6411>
</C186>
</QTY>
</SG26>
<SG26>
<LIN>
<E1082>000030</E1082>
<C212>
<E7143>SRV</E7143>
</C212>
</LIN>
<PIA>
<E4347>1</E4347>
<C212>
<E7140>000030</E7140>
<E7143>IN</E7143>
</C212>
</PIA>
<QTY>
<C186>
<E6063>21</E6063>
<E6060>2100.000</E6060>
<E6411>EA</E6411>
</C186>
</QTY>
<QTY>
<C186>
<E6063>170</E6063>
<E6060>1900.000</E6060>
<E6411>EA</E6411>
</C186>
</QTY>
</SG26>
<UNS>
<E0081>S</E0081>
</UNS>
</SG0>
<InterchangeTrailer>InterchangeTrailer</InterchangeTrailer>
</root>

我XSLT在第一部分中,我复制了所有内容,然后我尝试更改

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:msxml="urn:schemas-microsoft-com:xslt" xmlns:ext="urn:ext" exclude-result-prefixes="ext msxml">
<xsl:output method="xml" indent="yes" encoding="utf-8"/>
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="SG26[not(QTY/C186/E6063=59)]">
<xsl:copy>
<xsl:apply-templates select="@* | node()"/>
<QTY>
<C186>
<E6063>59</E6063>
<E6060>
<xsl:value-of select="'status'"/>
</E6060>
<E6411>
<xsl:value-of select="'status'"/>
</E6411>
</C186>
</QTY>
</xsl:copy>
</xsl:template>
<xsl:template match="SG26[not(QTY/C186/E6063=60)]">
<xsl:copy>
<xsl:apply-templates select="@* | node()"/>
<QTY>
<C186>
<E6063>60</E6063>
<E6060>
<xsl:value-of select="'status2'"/>
</E6060>
<E6411>
<xsl:value-of select="'status2'"/>
</E6411>
</C186>
</QTY>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>

我想添加一些元素,但不影响其他已经存在的元素。元素的顺序并不重要。但是其中一个新元素被删除了,我该如何修复?

也许你可以这样解决:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:msxml="urn:schemas-microsoft-com:xslt" xmlns:ext="urn:ext" exclude-result-prefixes="ext msxml">

<xsl:param name="elements-to-add-rtf">
<QTY>
<C186>
<E6063>59</E6063>
<E6060>status</E6060>
<E6411>status</E6411>
</C186>
</QTY>
<QTY>
<C186>
<E6063>60</E6063>
<E6060>status2</E6060>
<E6411>status2</E6411>
</C186>
</QTY>
</xsl:param>

<xsl:variable name="elements-to-add" select="msxml:node-set($elements-to-add-rtf)"/>

<xsl:output method="xml" indent="yes" encoding="utf-8"/>
<xsl:strip-space elements="*"/>

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

<xsl:template match="SG26">
<xsl:copy>
<xsl:apply-templates select="@* | node()"/>
<xsl:apply-templates select="$elements-to-add/QTY[not(C186/E6063 = current()/QTY/C186/E6063)]"/>
</xsl:copy>
</xsl:template>

</xsl:stylesheet>

请注意,XSLT 1对扩展函数node-set的名称空间的特定使用依赖于处理器,因为您的代码声明了与Microsoft处理器一起工作的前缀和名称空间,我假设您正在使用其中一个处理器并使用该前缀。

最新更新