【问题标题】:Grouping XML multiple elements into a single one将 XML 多个元素组合成一个元素
【发布时间】:2017-03-23 00:18:15
【问题描述】:

这是我的 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 文件中实现此逻辑,但无法实现。这是我目前正在尝试做的事情,我已经尝试了一些事情,但无法找到一种方法来做我需要的事情。

<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>

任何帮助将不胜感激。

【问题讨论】:

  • 我需要使用特定节点 OrderNo 从我的 XML 中消除重复元素

标签: xml xslt-1.0 xslt-grouping


【解决方案1】:

如果您不想在输出中出现重复的 &lt;Order&gt; 元素,请不要将模板应用到组成员,而是应用到组。

您目前正在执行“对于每个组,将模板应用于该组的所有元素”:

<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>

【讨论】:

  • Tomalak 但我得到了这样的输出
  • 我不这么认为。我已经测试了代码,它只生成了一个 &lt;R1&gt; 元素。
  • 我应用了第二个它正在工作
  • 您应该删除 &lt;xsl:for-each&gt;。我认为这会很清楚。
  • 别忘了接受其中一个答案。并且一定要尽快对他们两个投票(在 15 个代表点上将启用投票,这不会花费很长时间)。投票是本网站表达“谢谢”的方式。
【解决方案2】:

只要做:

<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 分组的。其他值(ItemIDSerialNo)将取自组的第一个成员(按文档顺序)。如果组中有其他值,它们将丢失。

【讨论】:

    猜你喜欢
    • 2017-03-23
    • 2018-02-17
    • 1970-01-01
    • 2016-06-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多