用一个最深的循环限制递归,并为所有元素分配精确的 id

2024-02-03

需要从混合顺序中对元素进行排序。排序是使用递归方法完成的。 代码中未实现 while 必须满足两个条件:

  • 递归应该只捕获最长的链。其他链不应输出
  • 一个元素与STATUS '0'(逻辑上 - 链中的第一个元素)不应显示
  • but its id-3值必须分配给所有其他后续元素(带有STATUS='1'在链中(作为附加的“common-id”字段)。

1-source

<root>

  <object id-1="aaaa" parent-id="bbbb" id-3="COMMON-ID-1"  STATUS="0" add-1="value" add-2="value"/>
  <object id-1="1111" parent-id="2222" id-3="COMMON-ID-2"  STATUS="0" add-1="value" add-2="value"/>

  <object id-1="bbbb" parent-id="cccc" id-3="value"        STATUS="1" add-1="value" add-2="value"/>
  <object id-1="2222" parent-id="3333" id-3="value"        STATUS="1" add-1="value" add-2="value"/>
  <object id-1="cccc" parent-id="dddd" id-3="value"        STATUS="1" add-1="value" add-2="value"/>
  <object id-1="3333" parent-id="4444" id-3="value"        STATUS="1" add-1="value" add-2="value"/>
  <object id-1="dddd" parent-id="eeee" id-3="value"        STATUS="1" add-1="value" add-2="value"/>
  <object id-1="4444" parent-id="5555" id-3="value"        STATUS="1" add-1="value" add-2="value"/>

</root>

2-呈现XSLT(产生所有递归,而只需要一个,未分配公共 ID)

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

  <xsl:key name="by-id" match="object" use="@id-1"/>

  <xsl:template match="object" mode="ancestors">
    <xsl:copy>
      <xsl:copy-of select="@*"/>

      <xsl:attribute name="COMMON-ID">
        <xsl:value-of select="@id-3[@STATUS='0']"/>
      </xsl:attribute>

      <xsl:apply-templates select="key('by-id', @parent-id)" mode="ancestors"/>
    </xsl:copy>
  </xsl:template>


  <xsl:template match="/">
    <root>
      <xsl:apply-templates select="root/object[@STATUS='1']" mode="ancestors"/>
    </root>
  </xsl:template>

</xsl:stylesheet>

3-output

<root>

  <object id-1="bbbb" id-2="cccc" id-3="value" STATUS="1" add-1="value" add-2="value" COMMON-ID="COMMON-ID-1"/> <!-- chain 1-->
  <object id-1="cccc" id-2="dddd" id-3="value" STATUS="1" add-1="value" add-2="value" COMMON-ID="COMMON-ID-1"/>
  <object id-1="dddd" id-2="eeee" id-3="value" STATUS="1" add-1="value" add-2="value" COMMON-ID="COMMON-ID-1"/>

  <object id-1="2222" id-2="3333" id-3="value"  STATUS="1" add-1="value" add-2="value" COMMON-ID="COMMON-ID-2"/>  <!-- chain 1-->
  <object id-1="3333" id-2="4444" id-3="value"  STATUS="1" add-1="value" add-2="value" COMMON-ID="COMMON-ID-2"/>
  <object id-1="4444" id-2="5555" id-3="value"  STATUS="1" add-1="value" add-2="value" COMMON-ID="COMMON-ID-2"/>

</root>

只是如何选择最长的一条链呢?

考虑以下大大简化例子。

重要的
在这个例子中,假设父母object最多可以有一个孩子object。这允许我们从祖先对象(没有父对象的对象)开始递归并向下工作。否则,我们必须为每个叶对象(没有任何子对象的对象)创建一个单独的链,并从那里向上递归。

XML

<root>
    <object id="a"/>
    <object id="b"/>
    <object id="c"/>
    <object id="aa" parent-id="a"/>
    <object id="bb" parent-id="b"/>
    <object id="cc" parent-id="c"/>
    <object id="aaa" parent-id="aa"/>
    <object id="bbb" parent-id="bb"/>
    <object id="ccc" parent-id="cc"/>
    <object id="bbbb" parent-id="bbb"/>
    <object id="cccc" parent-id="ccc"/>
    <object id="bbbbb" parent-id="bbbb"/>
</root>

XSLT 1.0(+ 节点集功能)

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:exsl="http://exslt.org/common"
extension-element-prefixes="exsl">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:strip-space elements="*"/>

<xsl:key name="child" match="object" use="@parent-id" />

<xsl:template match="/root">
    <!-- generate chains -->
    <xsl:variable name="chains">
        <xsl:apply-templates select="object[not(@parent-id)]"/>
    </xsl:variable>
    <!-- find the longest chain -->
    <xsl:for-each select="exsl:node-set($chains)/object">
        <xsl:sort select="count(descendant::object)" data-type="number" order="descending"/>
        <xsl:if test="position() =1 ">
            <xsl:copy-of select="."/>
        </xsl:if>
    </xsl:for-each>
</xsl:template>

<xsl:template match="object">
    <xsl:copy>
        <xsl:copy-of select="@*"/>
        <xsl:apply-templates select="key('child', @id)"/>
    </xsl:copy>
</xsl:template>

</xsl:stylesheet>

在第一遍之后,$chains变量将包含:

<object id="a">
  <object id="aa" parent-id="a">
    <object id="aaa" parent-id="aa"/>
  </object>
</object>
<object id="b">
  <object id="bb" parent-id="b">
    <object id="bbb" parent-id="bb">
      <object id="bbbb" parent-id="bbb">
        <object id="bbbbb" parent-id="bbbb"/>
      </object>
    </object>
  </object>
</object>
<object id="c">
  <object id="cc" parent-id="c">
    <object id="ccc" parent-id="cc">
      <object id="cccc" parent-id="ccc"/>
    </object>
  </object>
</object>

按链的长度(即后代对象的数量)对链进行排序并选择最长的链后,我们将得到:

Result

<?xml version="1.0" encoding="UTF-8"?>
<object id="b">
  <object id="bb" parent-id="b">
    <object id="bbb" parent-id="bb">
      <object id="bbbb" parent-id="bbb">
        <object id="bbbbb" parent-id="bbbb"/>
      </object>
    </object>
  </object>
</object>

提示:通过向下递归,可以很容易地使用模板参数将共同的价值观从祖先传递给其所有后代。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

用一个最深的循环限制递归,并为所有元素分配精确的 id 的相关文章

随机推荐

  • 为什么Java NIO可以优于标准Java套接字?

    最近我正在使用 Java 套接字和 NIO 来编写服务器 尽管我仍然不太清楚为什么 Java NIO 优于标准套接字 当使用这些技术之一编写服务器时 在大多数情况下 它归结为具有一个接受连接并将其进一步传递给工作线程的调度程序线程 我读过
  • 如何在 JSP 中的 derby 数据库中插入和删除值?

    历史 history https stackoverflow com questions 44149892 how can i insert value to a database to derby in jsp 问题是我无法从数据库中删除
  • 将函数推入数组 - 循环和拼接?

    使用 Javascript 我需要能够 1 将一定数量的相同函数 每个函数具有不同的参数 推送到数组中 2 然后一一运行每个函数 在本例中只是参数 编号的警报 3 在每个函数之后 我需要能够将该函数从数组中拼接出来 4 每次之后检查数组长度
  • Mac Os X 上的 NDK 构建错误:“致命错误:stdint.h:没有这样的文件或目录”

    我使用以下构建命令来构建OpenH264 https github com cisco openh264项目 make OS android ARCH arm64 NDKROOT Library Android android ndk r1
  • SVG 和 HTML 中的缩放元素有区别吗?

    这个问题 https stackoverflow com questions 5882716 html5 canvas vs svg vs div看起来很相似但最终是不同的并且没有帮助 而且 接受的答案是2011年写的 似乎已经过时了 该问
  • 在 R Shiny 中跨多个模块使用reactiveValues

    我正在尝试在 R 闪亮应用程序中的多个模块中使用reactiveValues 我举了一个例子来说明我的问题 它由一个主应用程序组成 其中包含一个reactiveValue 它是一个3列的数据帧和3个旨在 读取 写入 和 读写 reactiv
  • 如何使用 Swift 将 JSON 数组数据加载到 UIActionSheet 按钮标题中

    I have JSON内的数据array 我需要加载这个数组数据UIActionSheet button title 在这里 我尝试使用单个创建一个通用的 UIActionSheetbutton 基于数组字符串 我需要加载数据作为按钮标题
  • Python 的多个构造函数

    我有一个 A 类 可以通过两种不同的方式生成 a A xml 文件路径 a A 列表 列表 第一个方法以文件路径作为输入 从 XML 文件解析以获取 listA 和 listB 第二种方法给出了两个列表 我可以想到两种方法来实现多个构造函数
  • 虚函数可以被非虚函数覆盖吗?

    在此代码中 class Base public virtual void method 0 class Derived1 public Base public virtual void method override class Deriv
  • 从顶部滑动抽屉

    我试图让一个滑动抽屉在我的应用程序中从顶部拉下 但我无法找到一种方法来做到这一点 有什么帮助吗 内置的滑动抽屉不是那么灵活 你最好的选择是扩展它并修改它的行为 或者看看这个http code google com p android mis
  • Git 软件(例如 Gitbox、Github、SourceTree)可以使用远程存储库而不是本地存储库吗?

    我喜欢使用 Git 软件来推送提交 但我使用的软件 Gitbox Github SourceTree 在向其添加新存储库时都要求本地存储库 问题是 我的存储库位于我的开发服务器上 而不是我的本地计算机上 那么 Git 软件是否可以使用远程
  • Nodejs Express 4 Multer | Nodejs Express 4 Multer如果用户未授权则停止文件上传

    我在用着multer作为 Express 4 的多部分中间件 Express 配置为使用护照作为身份验证中间件 但如果用户未经身份验证 我找不到阻止文件上传的方法 我想使用 onFileUploadStart 来拒绝该文件 但我找不到与 请
  • 禁用链接和 上的浏览​​器工具提示

    当用户将鼠标悬停在某些链接和元素上时 我想抑制网络浏览器的默认工具提示显示 我知道这是可能的 但我不知道如何实现 有人可以帮忙吗 这样做的原因是抑制微格式日期时间的工具提示 BBC 放弃了对 hCalendar 的支持 因为机器可读日期的外
  • 您可以隐藏 QGroupBox 框架但保留其内容可见吗?

    我有一个QGroupBox 根据上下文 它的标题可能是多余的 显示在 GUI 的另一个位置 所以我需要将QGroupBox不在这里 但我必须保留它的内容可见 所以我不想打电话QGroupBox hide 我需要在运行时动态执行此操作 并希望
  • 如何使 Groovy 方法真正受到保护

    尝试在groovy中创建一个方法protected package com foo class Foo protected def getSomething 这不起作用 因为默认情况下 groovy 几乎使所有内容都可见 所以我尝试使用 P
  • HTML 按钮 - 按住按钮时它将重复该操作

    我是 HTML 新手 我正在开发一个项目 该项目需要使用一个按钮 当您按住它时 它会重复相同的操作 这是我到目前为止得到的代码 但没有起作用 DOCTYPE html gt
  • 三个值的异或

    进行三向异或的最简单方法是什么 换句话说 我有三个值 并且我想要一个仅计算为 true IFF 的语句one三个值中的一个为真 到目前为止 这就是我想出的 a b a c b c b a b c a c c a c b a b 有没有更简单
  • 使用 MongoDB C# 驱动程序查询构建器获取项目计数

    使用 MongoDB 的 C 驱动程序 我可以轻松构建一个查询 然后可以添加 SetSkip 和 SetLimit 参数以将结果集限制为特定大小 不过 我希望能够在应用 Skip 和 Take 之前知道查询的项目数是多少without执行查
  • 如何将 pandas 数据框转换为嵌套字典

    我正在运行 Python 3 6 和 Pandas 0 19 2 并且有一个 DataFrame 如下所示 Name Chain Food Healthy George McDonalds burger False George KFC c
  • 用一个最深的循环限制递归,并为所有元素分配精确的 id

    需要从混合顺序中对元素进行排序 排序是使用递归方法完成的 代码中未实现 while 必须满足两个条件 递归应该只捕获最长的链 其他链不应输出 一个元素与STATUS 0 逻辑上 链中的第一个元素 不应显示 but its id 3值必须分配