XSLT - 在父元素的最后位置插入元素
XSLT - Insert element at last position of parent
给定 XML
<SystemInfo>
<Info>
<Name>ABC</Name>
<ID>ZZ</ID>
<Number>2332</Number>
<Date>2020-10-10</Date>
<Version>1.0</Version>
</Info>
<Info>
<Name>XYZ</Name>
<ID>ZZ</ID>
<Number>1234</Number>
<Date>2020-10-10</Date>
<Ind>X</Ind>
</Info>
<Info>
<Name>PQR</Name>
<ID>ZZ</ID>
<Number>1234</Number>
<Date>2020-10-10</Date>
<Ack>Y</Ack>
</Info>
</SystemInfo>
仅当 Name = 'XYZ' 时,XSLT 才应将新元素添加为 'Info' 标记的最后一个元素
预期输出如下。
<SystemInfo>
<Info>
<Name>ABC</Name>
<ID>ZZ</ID>
<Number>2332</Number>
<Date>2020-10-10</Date>
<Version>1.0</Version>
</Info>
<Info>
<Name>XYZ</Name>
<ID>ZZ</ID>
<Number>1234</Number>
<Date>2020-10-10</Date>
<Ind>X</Ind>
**<Type>P</Type>**
</Info>
<Info>
<Name>PQR</Name>
<ID>ZZ</ID>
<Number>1234</Number>
<Date>2020-10-10</Date>
<Ack>Y</Ack>
</Info>
</SystemInfo>
下面两种方法我都试过了
第一次实施。
<xsl:template match="/|@*|node()">
<xsl:copy>
<xsl:apply-template select = "@*/node()" />
</xsl:copy>
</xsl:template>
<xsl:template match="ns0:Info[./ns0:Name='XYZ']">
<xsl:apply-template select = "@*/node()" />
<xsl:element name="Type">P</xsl:element>
</xsl:template>
--> 结果 >> 当 Name='XYZ'
时错过了 'Info' 标签
第二次实施。
<xsl:template match="/|@*|node()">
<xsl:copy>
<xsl:apply-template select = "@*/node()" />
</xsl:copy>
</xsl:template>
<xsl:template match="ns0:Info[./ns0:Name='XYZ']">
<xsl:copy-of select = "." />
<xsl:element name="Type">P</xsl:element>
</xsl:template>
--> 结果 >> 'Type' 显示在 'Info' 结束标签下方,而不是结束标签
上方
在此先感谢您的帮助
您只需对模板进行少量更改:
<xsl:template match="Info[Name='XYZ']">
<xsl:copy>
<xsl:apply-templates select = "@* | node()" />
<xsl:element name="Type">P</xsl:element>
</xsl:copy>
</xsl:template>
如有必要,将命名空间 ns0:
添加到您的匹配规则中,如下所示:
<xsl:template match="ns0:Info[ns0:Name='XYZ']">
...
并注意您的身份模板不正确。正确的是:
<!-- Identity template -->
<xsl:template match="@* | node()">
<xsl:copy>
<xsl:apply-templates select="@* | node()" />
</xsl:copy>
</xsl:template>
它的输出是:
<?xml version="1.0"?>
<SystemInfo>
<Info>
<Name>ABC</Name>
<ID>ZZ</ID>
<Number>2332</Number>
<Date>2020-10-10</Date>
<Version>1.0</Version>
</Info>
<Info>
<Name>XYZ</Name>
<ID>ZZ</ID>
<Number>1234</Number>
<Date>2020-10-10</Date>
<Ind>X</Ind>
<Type>P</Type> <!-- Added by template -->
</Info>
<Info>
<Name>PQR</Name>
<ID>ZZ</ID>
<Number>1234</Number>
<Date>2020-10-10</Date>
<Ack>Y</Ack>
</Info>
</SystemInfo>
给定 XML
<SystemInfo>
<Info>
<Name>ABC</Name>
<ID>ZZ</ID>
<Number>2332</Number>
<Date>2020-10-10</Date>
<Version>1.0</Version>
</Info>
<Info>
<Name>XYZ</Name>
<ID>ZZ</ID>
<Number>1234</Number>
<Date>2020-10-10</Date>
<Ind>X</Ind>
</Info>
<Info>
<Name>PQR</Name>
<ID>ZZ</ID>
<Number>1234</Number>
<Date>2020-10-10</Date>
<Ack>Y</Ack>
</Info>
</SystemInfo>
仅当 Name = 'XYZ' 时,XSLT 才应将新元素添加为 'Info' 标记的最后一个元素 预期输出如下。
<SystemInfo>
<Info>
<Name>ABC</Name>
<ID>ZZ</ID>
<Number>2332</Number>
<Date>2020-10-10</Date>
<Version>1.0</Version>
</Info>
<Info>
<Name>XYZ</Name>
<ID>ZZ</ID>
<Number>1234</Number>
<Date>2020-10-10</Date>
<Ind>X</Ind>
**<Type>P</Type>**
</Info>
<Info>
<Name>PQR</Name>
<ID>ZZ</ID>
<Number>1234</Number>
<Date>2020-10-10</Date>
<Ack>Y</Ack>
</Info>
</SystemInfo>
下面两种方法我都试过了
第一次实施。
<xsl:template match="/|@*|node()">
<xsl:copy>
<xsl:apply-template select = "@*/node()" />
</xsl:copy>
</xsl:template>
<xsl:template match="ns0:Info[./ns0:Name='XYZ']">
<xsl:apply-template select = "@*/node()" />
<xsl:element name="Type">P</xsl:element>
</xsl:template>
--> 结果 >> 当 Name='XYZ'
时错过了 'Info' 标签第二次实施。
<xsl:template match="/|@*|node()">
<xsl:copy>
<xsl:apply-template select = "@*/node()" />
</xsl:copy>
</xsl:template>
<xsl:template match="ns0:Info[./ns0:Name='XYZ']">
<xsl:copy-of select = "." />
<xsl:element name="Type">P</xsl:element>
</xsl:template>
--> 结果 >> 'Type' 显示在 'Info' 结束标签下方,而不是结束标签
上方在此先感谢您的帮助
您只需对模板进行少量更改:
<xsl:template match="Info[Name='XYZ']">
<xsl:copy>
<xsl:apply-templates select = "@* | node()" />
<xsl:element name="Type">P</xsl:element>
</xsl:copy>
</xsl:template>
如有必要,将命名空间 ns0:
添加到您的匹配规则中,如下所示:
<xsl:template match="ns0:Info[ns0:Name='XYZ']">
...
并注意您的身份模板不正确。正确的是:
<!-- Identity template -->
<xsl:template match="@* | node()">
<xsl:copy>
<xsl:apply-templates select="@* | node()" />
</xsl:copy>
</xsl:template>
它的输出是:
<?xml version="1.0"?>
<SystemInfo>
<Info>
<Name>ABC</Name>
<ID>ZZ</ID>
<Number>2332</Number>
<Date>2020-10-10</Date>
<Version>1.0</Version>
</Info>
<Info>
<Name>XYZ</Name>
<ID>ZZ</ID>
<Number>1234</Number>
<Date>2020-10-10</Date>
<Ind>X</Ind>
<Type>P</Type> <!-- Added by template -->
</Info>
<Info>
<Name>PQR</Name>
<ID>ZZ</ID>
<Number>1234</Number>
<Date>2020-10-10</Date>
<Ack>Y</Ack>
</Info>
</SystemInfo>