XSLT 将每第 n 个项目分组到新组中

Posted

技术标签:

【中文标题】XSLT 将每第 n 个项目分组到新组中【英文标题】:XSLT group every nth item in to new group 【发布时间】:2021-09-16 09:09:35 【问题描述】:

过去我很少做过 XSLT,但我在这方面面临挑战。 我正在使用 PLC 标记,对于每个标记我得到三个行集节点,所以在每三个行集之后我需要创建新的“行”组。 用 XSLT 更新

输入 XML:

 <?xml version="1.0" encoding="UTF-8"?>
<Rowsets >
    <Rowset>
        <Row>
            <DateTime>2021-07-05T07:33:38</DateTime>
            <WC_ID>0001</WC_ID>
        </Row>
    </Rowset>
    <Rowset>
        <Row>
            <DateTime>2021-07-05T07:33:38</DateTime>
            <Tag1_Good>6817</Tag1_Good>
        </Row>
    </Rowset>
    <Rowset>
        <Row>
            <DateTime>2021-07-05T07:33:38</DateTime>
            <Tag1_Bad>0</Tag1_Bad>
        </Row>
    </Rowset>
    <Rowset>
        <Row>
            <DateTime>2021-07-05T07:33:38</DateTime>
            <WC_ID>0002</WC_ID>
        </Row>
    </Rowset>
    <Rowset>
        <Row>
            <DateTime>2021-07-05T07:33:38</DateTime>
            <Tag2_Good>6800</Tag2_Good>
        </Row>
    </Rowset>
    <Rowset>
        <Row>
            <DateTime>2021-07-05T07:33:38</DateTime>
            <Tag2_Bad>0</Tag2_Bad>
        </Row>
    </Rowset>
</Rowsets>

预期输出:

<?xml version="1.0" encoding="UTF-8"?>
    <Rowset>
        <Row>
           
            <WC_ID>0001</WC_ID>
            <Tag1_Good>6817</Tag1_Good>
            <Tag1_Bad>0</Tag1_Bad>
        </Row>
        <Row>
           
            <WC_ID>0002</WC_ID>
            <Tag1_Good>6800</Tag1_Good>
            <Tag1_Bad>0</Tag1_Bad>
        </Row>
    </Rowset>
   

我的 XSLT:

 <?xml version="1.0" encoding="UTF-8"?>
    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
        <xsl:template match="/">
            <Rowsets >  
            <xsl:variable name="batchSize" select="3"/>
                <Rowset>           
                    <xsl:for-each select="/Rowsets/Rowset[position() mod $batchSize >= 0]"               
                        <Row>
                        <xsl:value-of select="Row/*[2]" />
                        </Row>
                    </xsl:for-each>              
                </Rowset>
            </Rowsets>
        </xsl:template>
    </xsl:stylesheet>

我无法将其加入新组

【问题讨论】:

这是***.com/a/45160347/3016153 的副本。不幸的是,SO不会让我将其关闭为重复,因为那里的答案没有被赞成或接受。无论如何,这应该关闭,因为它不是一个问题,而是对代码编写服务的请求。 这能回答你的问题吗? How to use the correct regex 【参考方案1】:

使用这个:

<Rowsets>
      <xsl:variable name="batchSize" select="3"/>
      <Rowset>
        <xsl:for-each select="/Rowsets/Rowset">
          <xsl:variable name="pos" select="position()"/>
          <xsl:if test="$pos mod $batchSize = 0">
            <Row>
              <WC_ID>
                <xsl:value-of select="/Rowsets/Rowset[$pos - 2]/Row/*[2]"/>
              </WC_ID>
              <Tag1_Good>
                <xsl:value-of select="/Rowsets/Rowset[$pos - 1]/Row/*[2]"/>
              </Tag1_Good>
              <Tag1_Bad>
                <xsl:value-of select="/Rowsets/Rowset[$pos]/Row/*[2]"/>
              </Tag1_Bad>
            </Row>
          </xsl:if>
        </xsl:for-each>
      </Rowset>
    </Rowsets>

【讨论】:

以上是关于XSLT 将每第 n 个项目分组到新组中的主要内容,如果未能解决你的问题,请参考以下文章

如何拆分Python列表每第N个元素

react.js每第n个项目添加开始标签或结束标签

XSLT / Muenchian 分组:如何从组中选择具有某些子元素的元素?

将现有的 GitLab 项目移动到新的子组中

维护嵌套元素的分组方法 XSLT 2.0 - 分离多余的

在 DotNetNuke 表单和列表中使用 XSLT 对项目进行分组