复制具有匹配位置编号的子节点



我有以下XML,并希望复制<itemInformation>元素以低于<orderLineItem>元素:

<?xml version="1.0" encoding="UTF-8"?>
<Envelope>
<order>
<orderLineItem>1
<requestedQuantity>
<value>2</value>
</requestedQuantity>
<tradeItemIdentification>
<gtin>07610400013192</gtin>
</tradeItemIdentification>
</orderLineItem>
<orderLineItem>2
<requestedQuantity>
<value>1</value>
</requestedQuantity>
<tradeItemIdentification>
<gtin>07610400014632</gtin>
</tradeItemIdentification>
</orderLineItem>
<extension>
<orderExtension>
<itemInformation>1
<tradeItemIdentification>
<gtin>07610400013192</gtin>
</tradeItemIdentification>
<grossCost>
<currencyCode>
<currencyISOCode>ZAR</currencyISOCode>
</currencyCode>
<monetaryAmount>243.60</monetaryAmount>
</grossCost>
</itemInformation>
<itemInformation>2
<tradeItemIdentification>
<gtin>07610400014632</gtin>
</tradeItemIdentification>
<grossCost>
<currencyCode>
<currencyISOCode>ZAR</currencyISOCode>
</currencyCode>
<monetaryAmount>243.60</monetaryAmount>
</grossCost>
</itemInformation>
</orderExtension>
</extension>
</order>
</Envelope>

我想出了以下 XSLT:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="1.0">
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="order/orderLineItem">
<xsl:copy>
<xsl:apply-templates select="@*" />
<xxxx>
<xsl:apply-templates select="parent::order/extension/orderExtension/itemInformation
[normalize-space(text())=normalize-space(ancestor::order/orderLineItem/text())]"/>
</xxxx>
<xsl:apply-templates select="node()"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>

我期待这个目标 XML:

<?xml version="1.0" encoding="UTF-8"?>
<Envelope>
<order>
<orderLineItem>
<xxxx>
<itemInformation>1
<tradeItemIdentification>
<gtin>07610400013192</gtin>
</tradeItemIdentification>
<grossCost>
<currencyCode>
<currencyISOCode>ZAR</currencyISOCode>
</currencyCode>
<monetaryAmount>243.60</monetaryAmount>
</grossCost>
</itemInformation>
</xxxx>1
<requestedQuantity>
<value>2</value>
</requestedQuantity>
<tradeItemIdentification>
<gtin>07610400013192</gtin>
</tradeItemIdentification>
</orderLineItem>
<orderLineItem>
<xxxx>
<itemInformation>2
<tradeItemIdentification>
<gtin>07610400014632</gtin>
</tradeItemIdentification>
<grossCost>
<currencyCode>
<currencyISOCode>ZAR</currencyISOCode>
</currencyCode>
<monetaryAmount>243.60</monetaryAmount>
</grossCost>
</itemInformation>
</xxxx>2
<requestedQuantity>
<value>1</value>
</requestedQuantity>
<tradeItemIdentification>
<gtin>07610400014632</gtin>
</tradeItemIdentification>
</orderLineItem>
<extension>
<orderExtension>
<itemInformation>1
<tradeItemIdentification>
<gtin>07610400013192</gtin>
</tradeItemIdentification>
<grossCost>
<currencyCode>
<currencyISOCode>ZAR</currencyISOCode>
</currencyCode>
<monetaryAmount>243.60</monetaryAmount>
</grossCost>
</itemInformation>
<itemInformation>2
<tradeItemIdentification>
<gtin>07610400014632</gtin>
</tradeItemIdentification>
<grossCost>
<currencyCode>
<currencyISOCode>ZAR</currencyISOCode>
</currencyCode>
<monetaryAmount>243.60</monetaryAmount>
</grossCost>
</itemInformation>
</orderExtension>
</extension>
</order>
</Envelope>

但是在第二个<orderLineItem>元素中,我再次得到第一个<itemInformation>而不是第二个。 所以我必须匹配<itemInformation>1、2,...<orderLineItem>1、2,...我只是无法弄清楚我需要为此使用的 XPATH。

正确的 XPath 表达式如下:

../extension/orderExtension/itemInformation[normalize-space(text())=normalize-space(current()/text())]

你的问题是你弄乱了上下文节点,请记住,谓词中的任何相对路径表达式(你放在括号之间的表达式)都引用当前元素,如果表达式计算结果为 true,则会选择该元素。current函数由 XSLT 定义,并引用其上下文元素,该元素与整个 XPath 的上下文元素相同(但它在谓词中发生了变化)。

我还用其缩写语法替换了parent::order步骤..

最新更新