这是我要为其编写xsl文件的xml文件。此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" />
假定每个不同的
VNo
发生相同的OrderNo
。然后,要获取每个不同的Order
的OrderNo
元素的首次出现,请执行此操作...<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>
如果同一
VNo
可以有多个OrderNo
元素,则需要像这样定义键<xsl:key name="orders" match="Order" use="concat(OrderNo, '|', VNo)" />
您还需要相应地更改密钥的任何用法。
关于java - 具有多个订单标签的xml的XSLT转换,创建对应的XML,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/40400729/