这是我要为其编写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。然后,要获取每个不同的OrderOrderNo元素的首次出现,请执行此操作...

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

10-08 21:36