将 XML 多个元素分组为一个元素
Grouping XML multiple elements into a single one
这是我的 XML 文件,我们已经为其编写了一个 xsl 文件。此 xsl 的目的是用于 XML 操作。
输入XML
<ns1:POOrder xmlns:ns1="http://tanole/SO11/ERP_PD_EMS/RD_SalesOrder_Defirm">
<RIOrder>
<Order>
<SerialNo>0922830281</SerialNo>
<ItemID>2345</ItemID>
<OrderNo>0128333331</OrderNo>
</Order>
<Order>
<SerialNo>0922830281</SerialNo>
<ItemID>2345</ItemID>
<OrderNo>0128333331</OrderNo>
</Order>
</RIOrder>
</ns1:POOrder>
预期输出:
<RIOrders>
<R1 OrderNo="0128333331" ItemID="2345" SerialNo="0922830281"/>
</RIOrders>
我正在尝试在我的 xsl 文件中实现此逻辑,但无法获得 so.This 是我目前正在尝试做的事情,我已经尝试了一些事情,但无法找到一种方法来做我需要
<xsl:stylesheet
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="xml" indent="yes" />
<xsl:key name="orders" match="Order" use="OrderNo" />
<xsl:template match="/*">
<RIOrders>
<xsl:for-each select="RIOrder/Order[generate-id() = generate-id(key('orders', OrderNo)[1])]">
<xsl:apply-templates select="key('orders', OrderNo)" />
</xsl:for-each>
</RIOrders>
</xsl:template>
<xsl:template match="Order">
<R1 OrderNo="{OrderNo}" ItemID="{ItemID}" SerialNo="{SerialNo}" UpdateDateOn="N" />
</xsl:template>
</xsl:stylesheet>
如有任何帮助,我们将不胜感激。
如果您不想在输出中出现重复的 <Order>
元素,请不要将模板应用于群组成员,而是应用于群组。
您目前在 "for each group, apply templates to all elements of the group":
<xsl:for-each select="RIOrder/Order[generate-id() = generate-id(key('orders', OrderNo)[1])]">
<xsl:apply-templates select="key('orders', OrderNo)" />
</xsl:for-each>
而你实际上想做的是:
<xsl:apply-templates select="RIOrder/Order[generate-id() = generate-id(key('orders', OrderNo)[1])]" />
样本输入的输出是:
<RIOrders>
<R1 OrderNo="0128333331" ItemID="2345" SerialNo="0922830281" UpdateDateOn="N" />
</RIOrders>
就这样:
<xsl:stylesheet
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="xml" indent="yes" />
<xsl:key name="orders" match="Order" use="OrderNo" />
<xsl:template match="/*">
<RIOrders>
<xsl:for-each select="RIOrder/Order[generate-id() = generate-id(key('orders', OrderNo)[1])]">
<R1 OrderNo="{OrderNo}" ItemID="{ItemID}" SerialNo="{SerialNo}" UpdateDateOn="N" />
</xsl:for-each>
</RIOrders>
</xsl:template>
</xsl:stylesheet>
请注意,您是按 OrderNo
分组的。其他值(ItemID
和 SerialNo
)将从组的第一个成员中获取(按文档顺序)。如果该组中还有其他值,它们将丢失。
这是我的 XML 文件,我们已经为其编写了一个 xsl 文件。此 xsl 的目的是用于 XML 操作。
输入XML
<ns1:POOrder xmlns:ns1="http://tanole/SO11/ERP_PD_EMS/RD_SalesOrder_Defirm">
<RIOrder>
<Order>
<SerialNo>0922830281</SerialNo>
<ItemID>2345</ItemID>
<OrderNo>0128333331</OrderNo>
</Order>
<Order>
<SerialNo>0922830281</SerialNo>
<ItemID>2345</ItemID>
<OrderNo>0128333331</OrderNo>
</Order>
</RIOrder>
</ns1:POOrder>
预期输出:
<RIOrders>
<R1 OrderNo="0128333331" ItemID="2345" SerialNo="0922830281"/>
</RIOrders>
我正在尝试在我的 xsl 文件中实现此逻辑,但无法获得 so.This 是我目前正在尝试做的事情,我已经尝试了一些事情,但无法找到一种方法来做我需要
<xsl:stylesheet
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="xml" indent="yes" />
<xsl:key name="orders" match="Order" use="OrderNo" />
<xsl:template match="/*">
<RIOrders>
<xsl:for-each select="RIOrder/Order[generate-id() = generate-id(key('orders', OrderNo)[1])]">
<xsl:apply-templates select="key('orders', OrderNo)" />
</xsl:for-each>
</RIOrders>
</xsl:template>
<xsl:template match="Order">
<R1 OrderNo="{OrderNo}" ItemID="{ItemID}" SerialNo="{SerialNo}" UpdateDateOn="N" />
</xsl:template>
</xsl:stylesheet>
如有任何帮助,我们将不胜感激。
如果您不想在输出中出现重复的 <Order>
元素,请不要将模板应用于群组成员,而是应用于群组。
您目前在 "for each group, apply templates to all elements of the group":
<xsl:for-each select="RIOrder/Order[generate-id() = generate-id(key('orders', OrderNo)[1])]">
<xsl:apply-templates select="key('orders', OrderNo)" />
</xsl:for-each>
而你实际上想做的是:
<xsl:apply-templates select="RIOrder/Order[generate-id() = generate-id(key('orders', OrderNo)[1])]" />
样本输入的输出是:
<RIOrders>
<R1 OrderNo="0128333331" ItemID="2345" SerialNo="0922830281" UpdateDateOn="N" />
</RIOrders>
就这样:
<xsl:stylesheet
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="xml" indent="yes" />
<xsl:key name="orders" match="Order" use="OrderNo" />
<xsl:template match="/*">
<RIOrders>
<xsl:for-each select="RIOrder/Order[generate-id() = generate-id(key('orders', OrderNo)[1])]">
<R1 OrderNo="{OrderNo}" ItemID="{ItemID}" SerialNo="{SerialNo}" UpdateDateOn="N" />
</xsl:for-each>
</RIOrders>
</xsl:template>
</xsl:stylesheet>
请注意,您是按 OrderNo
分组的。其他值(ItemID
和 SerialNo
)将从组的第一个成员中获取(按文档顺序)。如果该组中还有其他值,它们将丢失。