当前位置: 首页 > 知识库问答 >
问题:

XSLT-对于每个组

邰勇军
2023-03-14

这是一个非常基本的问题,但我不理解for each group是如何工作的。我想把没有子节的相邻顶层节合并到一个列表中。如果有带有小节的部分,我想以不同的方式对待它们,保持顶层不变,并将子部分合并到一个列表中。我不想把这些混为一谈。

源XML

  <?xml version="1.0" encoding="UTF-8"?>
  <body>
     <sec>
        <title>A1</title>
        <p>Stuff A 1</p>
     </sec>
     <sec>
        <title>A2</title>
        <p>Stuff A 2</p>
     </sec>
     <sec>
        <title>A3</title>
        <p>Stuff A 3</p>
        <sec>
           <title>B1</title>
           <p>Stuff B1</p>
        </sec>
        <sec>
           <title>B2</title>
           <p>Stuff B2</p>
        </sec>
     </sec>
     <sec>
        <title>A4</title>
        <p>Stuff A 4</p>
     </sec>
  </body>

期望的结果

  <body>
     <list>
           <list-item><title>A1</title><p>Stuff A 1</p></list-item>
           <list-item><title>A2</title><p>Stuff A 2</p></list-item>
     </list>
     <sec>
        <title>A3</title>
        <p>Stuff A 3</p>
        <list>
          <list-item><title>B1</title><p>Stuff B1</p></list-item>
          <list-item><title>B2</title><p>Stuff B2</p></list-item>
        </list>
     </sec>
     <list>
        <list-item><title>A4</title><p>Stuff A 4</p></list-item>
     </list>
  </body>

XSLT片段这绝对是不正确的。此外,这不是我尝试过的唯一方式,只是最不混乱的帖子。我认为对于每个组应该工作的方式是,我一直得到一个错误,不允许将空序列作为xsl的@group-appendent属性:对于每个组。这只是一个小片段,让那些知道自己在做什么的人开始。

    <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">

        <!-- Identity Template -->
        <xsl:template match="@*|node()" name="default" mode="#all">
            <xsl:copy>
                <xsl:copy-of select="@*"/>
                <xsl:apply-templates mode="#current"/>
            </xsl:copy>
        </xsl:template>

        <!-- Make top level body tag -->
        <xsl:template match="body">
            <body>
                <xsl:for-each-group select="sec[not(sec)]" group-adjacent=".">
                    <list>
                        <xsl:apply-templates select="current-group()"/>
                    </list>
                </xsl:for-each-group>
          </body>
        </xsl:template>

        <xsl:template match="sec[not(sec)]">
            <list-item>
                <xsl:copy-of select="*"/>
            </list-item>
        </xsl:template>

    </xsl:stylesheet>

共有1个答案

韩安顺
2023-03-14

试试吧

<xsl:for-each-group select="sec" group-adjacent="exists(child::sec)">

这将给出一组具有子元素的元素,后跟一组没有子元素的元素,依此类推。

在每个组的中,您可能需要执行

 类似资料:
  • 我目前正在尝试将非常混乱的xml的一部分转换为更具可读性的内容,但当我的代码没有产生我想要的内容时。 我可以获得一些关于我的代码有什么问题以及如何修复它的反馈吗? 输入示例: 我想看到的输出是: 我的代码当前如下所示: 内容没有被正确复制,我不知道为什么?

  • 我想包括以下内容: 在此中,每个 我试过这个: 但是,我得到了这个错误:

  • 问题内容: 我想为每个循环做一个,但要使其同步运行。循环的每次迭代都将执行http.get调用,并返回json以将值插入数据库中。问题是for循环异步运行,这导致所有http.gets一次全部运行,并且我的数据库最终没有插入所有数据。我正在使用async- foreach尝试执行我想要的操作它可以做到,但是如果我能以正确的方式做到这一点,我就不必使用它。 和我的模特 问题答案: 我发现在完成每个调

  • 我试图使用mulesoft上的for-each块在节点Node3a上迭代,但似乎不起作用。你知道我怎样才能做到这一点吗?

  • 我想在spring boot中,当响应对象对于每个响应自动为null时返回404。 我需要建议。 我不想检查控制器中的对象是否为null。

  • 问题内容: 这是Java代码的片段: 它显示5。但是为什么声明了for循环的声明部分,却没有声明? 在uu上,您将引用2D数组…这不是一项作业。我正在准备Java认证。干杯 问题答案: 由于你是一个。因此,当您对其进行迭代时,您将首先获得,然后可以对该数组进行迭代以获取单个元素。 因此,您的外部循环具有as类型,因此具有该声明。如果您在另一个内循环中进行迭代,则将得到以下类型:-