使用XSLT根据给定的编号对XML文件进行分组

拉桑加·阿比昆

我想基于XML标记值对XML文件进行分组。以下是我的输入XML。

<Root>
    <GroupNumber>3</GroupNumber>
    <EDICustomer>
        <Company>IWS</Company>
        <Customer>150</Customer>
        <CreationDate>2020-03-15T10:29:08.813</CreationDate>
        <CreationTime>2020-03-15T10:29:08.813</CreationTime>
        <EDICustomerLine>
            <Barcode>447896130245</Barcode>
            <ItemDescription>Medium</ItemDescription>
            <Warehouse>B01</Warehouse>
            <Status>12</Status>
        </EDICustomerLine>
        <EDICustomerLine>
            <Barcode>447896130245</Barcode>
            <ItemDescription>Medium</ItemDescription>
            <Warehouse>B01</Warehouse>
            <Status>12</Status>
        </EDICustomerLine>
        <EDICustomerLine>
            <Barcode>447896130245</Barcode>
            <ItemDescription>Medium</ItemDescription>
            <Warehouse>B01</Warehouse>
            <Status>12</Status>
        </EDICustomerLine>
        <EDICustomerLine>
            <Barcode>447896130245</Barcode>
            <ItemDescription>Medium</ItemDescription>
            <Warehouse>B01</Warehouse>
            <Status>12</Status>
        </EDICustomerLine>
    </EDICustomer>
</Root>

我不知道会有多少EDICustomerLine标签。如果GroupNumber值大于EDICustomerLine标签的数量,则保留EDICustomer子标签不变,但如果GroupNumber小于EDICustomerLine标签,我们必须根据GroupNumber标签的值拆分EDICustomerLine标签。因此,在这种情况下,预期的XML将如下所示。

<Root>
    <EDICustomer>
        <Company>IWS</Company>
        <Customer>150</Customer>
        <CreationDate>2020-03-15T10:29:08.813</CreationDate>
        <CreationTime>2020-03-15T10:29:08.813</CreationTime>
        <EDICustomerLine>
            <Barcode>447896130245</Barcode>
            <ItemDescription>Medium</ItemDescription>
            <Warehouse>B01</Warehouse>
            <Status>12</Status>
        </EDICustomerLine>
        <EDICustomerLine>
            <Barcode>447896130245</Barcode>
            <ItemDescription>Medium</ItemDescription>
            <Warehouse>B01</Warehouse>
            <Status>12</Status>
        </EDICustomerLine>
        <EDICustomerLine>
            <Barcode>447896130245</Barcode>
            <ItemDescription>Medium</ItemDescription>
            <Warehouse>B01</Warehouse>
            <Status>12</Status>
        </EDICustomerLine>
    </EDICustomer>
    <EDICustomer>
        <Company>IWS</Company>
        <Customer>150</Customer>
        <CreationDate>2020-03-15T10:29:08.813</CreationDate>
        <CreationTime>2020-03-15T10:29:08.813</CreationTime>
        <EDICustomerLine>
            <Barcode>447896130245</Barcode>
            <ItemDescription>Medium</ItemDescription>
            <Warehouse>B01</Warehouse>
            <Status>12</Status>
        </EDICustomerLine>
    </EDICustomer>
</Root>

第一个EDICustomer父标记基于组号值包含Company,Customer,CreationDate,CreationTime和3。这样,第二个EDICustomer应该包含3个或更少的标签。我们不知道将有多少EDICustomerLine标签和组号的值。

<Company>IWS</Company>
        <Customer>150</Customer>
        <CreationDate>2020-03-15T10:29:08.813</CreationDate>
        <CreationTime>2020-03-15T10:29:08.813</CreationTime>

上面的这一部分应该在所有EDICustomer组中重复(如果我们找到一种基于组号循环EDICustomerLine的方法,则可以进行此部分)。

首先,我想知道在XSLT中是否可能出现这种情况。
如果可能的话,你们可以帮我吗?

zx485

您可以使用以下XSLT-2.0样式表获得所需的结果。它将<EDICustomerLine>元素分组为GroupNumber,然后在上迭代current-group()常量部分由first创建xsl:copy-of

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" omit-xml-declaration="yes" indent="yes"/>

  <xsl:template match="text()" />

  <!-- identity template -->
  <xsl:template match="node()|@*">
    <xsl:copy>
      <xsl:apply-templates select="node()|@*" />
    </xsl:copy>
   </xsl:template>  

   <xsl:template match="Root">
     <xsl:variable name="max" select="GroupNumber" />
     <xsl:copy>
        <!-- Handle the "zero-items" situation" -->
        <xsl:if test="count(EDICustomer/EDICustomerLine) = 0">
            <EDICustomer>
                <xsl:copy-of select="EDICustomer[1]/Company | EDICustomer[1]/Customer | EDICustomer[1]/CreationDate | EDICustomer[1]/CreationTime" />
            </EDICustomer>
        </xsl:if>
        <xsl:for-each-group select="EDICustomer/EDICustomerLine" group-by="(position()-1) idiv $max">
            <EDICustomer>
                <!-- Add a <GroupNr> element with the index of the group -->
                <GroupNr><xsl:value-of select="position()" /></GroupNr>
                <xsl:copy-of select="../Company | ../Customer | ../CreationDate | ../CreationTime" />
                <xsl:copy-of select="current-group()" />
            </EDICustomer>
        </xsl:for-each-group>
    </xsl:copy>
  </xsl:template>

</xsl:stylesheet>

其结果是:

<Root>
    <EDICustomer>
        <GroupNr>1</GroupNr>
        <Company>IWS</Company>
        <Customer>150</Customer>
        <CreationDate>2020-03-15T10:29:08.813</CreationDate>
        <CreationTime>2020-03-15T10:29:08.813</CreationTime>
        <EDICustomerLine>
            <Barcode>447896130245</Barcode>
            <ItemDescription>Medium</ItemDescription>
            <Warehouse>B01</Warehouse>
            <Status>12</Status>
        </EDICustomerLine>
        <EDICustomerLine>
            <Barcode>447896130245</Barcode>
            <ItemDescription>Medium</ItemDescription>
            <Warehouse>B01</Warehouse>
            <Status>12</Status>
        </EDICustomerLine>
        <EDICustomerLine>
            <Barcode>447896130245</Barcode>
            <ItemDescription>Medium</ItemDescription>
            <Warehouse>B01</Warehouse>
            <Status>12</Status>
        </EDICustomerLine>
    </EDICustomer>
    <EDICustomer>
        <GroupNr>2</GroupNr>
        <Company>IWS</Company>
        <Customer>150</Customer>
        <CreationDate>2020-03-15T10:29:08.813</CreationDate>
        <CreationTime>2020-03-15T10:29:08.813</CreationTime>
        <EDICustomerLine>
            <Barcode>447896130245</Barcode>
            <ItemDescription>Medium</ItemDescription>
            <Warehouse>B01</Warehouse>
            <Status>12</Status>
        </EDICustomerLine>
    </EDICustomer>
</Root>

这是所希望的。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

根据子元素的属性使用 XSLT 或 Python 对 XML 文件进行排序

来自分类Dev

使用XSLT对XML文件进行排序

来自分类Dev

使用XSLT对重复的XML数据进行分组

来自分类Dev

使用XSLT对一些XML元素进行分组

来自分类Dev

使用xslt对未分组的xml标记进行foreach循环

来自分类Dev

使用XSLT对重复的XML数据进行分组

来自分类Dev

使用没有密钥的XSLT进行XML分组

来自分类Dev

使用 XSLT 在新 XML 中按属性对元素进行分组

来自分类Dev

使用 xslt 对 XML 节点进行分组和求和

来自分类Dev

使用XSLT根据几个子元素对XML进行排序

来自分类Dev

根据列中的分组元素对项目进行编号

来自分类Dev

使用xslt sort对给定的顺序进行排序

来自分类Dev

使用xslt sort对给定的顺序进行排序

来自分类Dev

使用XSLT 1.0对相邻项目进行分组

来自分类Dev

使用XSL对XML进行分组

来自分类Dev

使用XSLT 1.0在每两个处理指令之间对XML节点进行分组

来自分类Dev

如何使用XSLT 2按照XSD xshema文件中给定的顺序对元素进行排序:执行排序

来自分类Dev

使用linq根据ID对集合进行分组

来自分类Dev

如何使用XSLT根据输入XML请求的相同属性从XML文件中删除公共节点?

来自分类Dev

使用XSLT 1.0根据引用的XML文件中的元素删除元素(WXS组件/文件/等)

来自分类Dev

XSLT 用于基于父节点对 XML 进行分组和重组

来自分类Dev

我如何根据员工编号和日期对进入和超时进行分组

来自分类Dev

使用xslt更新XML文件

来自分类Dev

XSLT - 分组 XML 数据

来自分类Dev

根据特定的子节点对 xml 节点进行分组和合并

来自分类Dev

根据子元素对XML文件进行排序

来自分类Dev

使用XSLT 1进行XML转换

来自分类Dev

如何使用xslt对xml进行排序

来自分类Dev

如何使用XSLT升序对XML进行排序

Related 相关文章

  1. 1

    根据子元素的属性使用 XSLT 或 Python 对 XML 文件进行排序

  2. 2

    使用XSLT对XML文件进行排序

  3. 3

    使用XSLT对重复的XML数据进行分组

  4. 4

    使用XSLT对一些XML元素进行分组

  5. 5

    使用xslt对未分组的xml标记进行foreach循环

  6. 6

    使用XSLT对重复的XML数据进行分组

  7. 7

    使用没有密钥的XSLT进行XML分组

  8. 8

    使用 XSLT 在新 XML 中按属性对元素进行分组

  9. 9

    使用 xslt 对 XML 节点进行分组和求和

  10. 10

    使用XSLT根据几个子元素对XML进行排序

  11. 11

    根据列中的分组元素对项目进行编号

  12. 12

    使用xslt sort对给定的顺序进行排序

  13. 13

    使用xslt sort对给定的顺序进行排序

  14. 14

    使用XSLT 1.0对相邻项目进行分组

  15. 15

    使用XSL对XML进行分组

  16. 16

    使用XSLT 1.0在每两个处理指令之间对XML节点进行分组

  17. 17

    如何使用XSLT 2按照XSD xshema文件中给定的顺序对元素进行排序:执行排序

  18. 18

    使用linq根据ID对集合进行分组

  19. 19

    如何使用XSLT根据输入XML请求的相同属性从XML文件中删除公共节点?

  20. 20

    使用XSLT 1.0根据引用的XML文件中的元素删除元素(WXS组件/文件/等)

  21. 21

    XSLT 用于基于父节点对 XML 进行分组和重组

  22. 22

    我如何根据员工编号和日期对进入和超时进行分组

  23. 23

    使用xslt更新XML文件

  24. 24

    XSLT - 分组 XML 数据

  25. 25

    根据特定的子节点对 xml 节点进行分组和合并

  26. 26

    根据子元素对XML文件进行排序

  27. 27

    使用XSLT 1进行XML转换

  28. 28

    如何使用xslt对xml进行排序

  29. 29

    如何使用XSLT升序对XML进行排序

热门标签

归档