gpt4 book ai didi

java - 使用多个订单标签对 xml 进行 XSLT 转换,创建相应的 XML

转载 作者:行者123 更新时间:2023-12-02 03:15:17 24 4
gpt4 key购买 nike

这是我的 xml 文件,我要为其编写一个 xsl 文件。这个xsl的目的是使用xml来执行一些操作。

输入Xml

    <ns1:SalesOrder xmlns:ns1="http://tanole/SO11/ERP_PD_EMS/RD_SalesOrder_Defirm">
<Rder>
<Order>
<OrderNo>457</OrderNo>
<LineNo>1</LineNo>
<SerialNO>23</SerialNO>
<VNo>567</VNo>
</Order>
<Order>
<OrderNo>457</OrderNo>
<LineNo>2</LineNo>
<SerialNO>29</SerialNO>
<VNo>567</VNo>
</Order>
<Order>
<OrderNo>458</OrderNo>
<LineNo>1</LineNo>
<SerialNO>96</SerialNO>
<VNo>543</VNo>
</Order>
<Order>
<OrderNo>458</OrderNo>
<LineNo>2</LineNo>
<SerialNO>32</SerialNO>
<VNo>543</VNo>
</Order>
</Rder>
</ns1:SalesOrder>

Expecting Output
<Order VNo="567" OrderNo="457">
<OrderLines>
<OrderLine LineNo="1" SerialNO="23"/>
<OrderLine LineNo="2" SerialNO="29"/>
<OrderLines>
</Order>

<Order VNo="543" OrderNo="458">
<OrderLines>
<OrderLine LineNo="1" SerialNO="96"/>
<OrderLine LineNo="2" SerialNO="32"/>
<OrderLines>
</Order>

我正在尝试在我的 xsl 文件中实现此逻辑,但无法实现。这就是我目前正在尝试做的事情,我已经尝试了一些方法,但无法找到一种方法来完成我需要的操作。

        <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" indent="yes"/>
<xsl:template match="@*|node()">
<Order>
<xsl:attribute name="VNo"><xsl:value-of select="VNo"/></xsl:attribute>
<xsl:attribute name="OrderNo"><xsl:value-of select="DocumentType"/></xsl:attribute>
<OrderLines>
<xsl:element name="OrderLine">
<xsl:if test ="not(preceding::Order[LineNo/text() = current()/LineNo/text()] )">
<xsl:attribute name="SerialNO"><xsl:value-of select="OrderNo"/></xsl:attribute>
<xsl:attribute name="LineNo"><xsl:value-of select="position()"/></xsl:attribute>

</xsl:if>
</xsl:element>
<!-- </xsl:if>
</xsl:if>-->
</OrderLines>
</Order>
</xsl:template>
</xsl:stylesheet>

如有任何帮助,我们将不胜感激。

最佳答案

要使用 Muenchian 分组,您的第一个定义键来代表您的组

<xsl:key name="orders" match="Order" use="OrderNo" />

这假设每个不同的 OrderNo 出现相同的 VNo。然后,要获取每个不同 OrderNoOrder 元素的第一次出现,您可以执行以下操作...

<xsl:for-each select="Rder/Order[generate-id() = generate-id(key('orders', OrderNo)[1])]">

尝试这个 XSLT

<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="/*">
<SalesOrders>
<xsl:for-each select="Rder/Order[generate-id() = generate-id(key('orders', OrderNo)[1])]">
<Order VNo="{VNo}" OrderNo="{OrderNo}">
<OrderLines>
<xsl:apply-templates select="key('orders', OrderNo)" />
</OrderLines>
</Order>
</xsl:for-each>
</SalesOrders>
</xsl:template>

<xsl:template match="Order">
<OrderLine LineNo="{LineNo}" SerialNO="{SerialNO}"/>
</xsl:template>
</xsl:stylesheet>

如果同一个 OrderNo 可以有多个 VNo 元素,则需要像这样定义 key

<xsl:key name="orders" match="Order" use="concat(OrderNo, '|', VNo)" />

您还需要相应地更改 key 的任何用途。

关于java - 使用多个订单标签对 xml 进行 XSLT 转换,创建相应的 XML,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40400729/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com