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

标签 java xml xslt

这是我的 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/

相关文章:

java - 如何扩展 Collectors 类

Java程序将birt报告导出到excel

java - RestTemplate uriVariables 未扩展

xml - XSLT:<xsl:element name ="a"> 和 <a> 之间的区别

xml - 独立值不会出现在 moxy - jaxb 生成的 xml 中

xml - 通用 XSLT 1.0 从根节点获取不同的叶节点路径?

JavaFX java.lang.IllegalArgumentException : argument type mismatch [scene builder]

xml - 使用 XML 声明一个自定义的 android UI 元素

c# - 转换 XML 时路径异常中的非法字符

xslt - xsl :when conditions 的嵌套