创建一个分层的 xml 形式,形成一个类似于书籍描述的“平面”xml

2024-04-17

这是一个后续问题“选择当前元素和当前元素的下一个元素之间的所有元素” https://stackoverflow.com/q/16145859/2115381。即使我不确定创建一个新问题是否是正确的方法,但我还是这样做。因为原来的问题已经回答了,但是后来又改变了。所以在我看来,改变的问题是开放的。另外,我认为更改后的问题应该放回统计数据中,如果它适合答案。

问题是如何从“平面”xml(如书籍描述)创建分层 xml。

输入的xml是这样的

<root>
    <heading_1>Section 1</heading_1>
    <para>...</para>
    <list_1>...</list_1>
    <heading_2>Section 1.1</heading_2>
    <para>...</para>
    <heading_3>Section 1.1.1</heading_3>
    <para>...</para>
    <list_1>...</list_1>
    <heading_2>Section 1.2</heading_2>
    <para>...</para>
    <footnote>...</footnote>
    <heading_1>Section 2</heading_1>
    <para>...</para>
    <list_1>...</list_1>
    <heading_2>Section 2.1</heading_2>
    <para>...</para>
    <list_1>...</list_1>
    <list_2>...</list_2>
    <heading_3>Seciton 2.1.1</heading_3>
    <para>...</para>
    <heading_2>Section 2.2</heading_2>
    <para>...</para>
    <footnote>...</footnote>
</root>

Each <heading_*>应该被解释为一个开始<section>预期的输出 xml 是。

<section>
    <title>Section 1</title>
    <para>...</para>
    <list_1>...</list_1>
    <section>
        <title>Section 1.1</title>
        <para>...</para>
        <section>
            <title>Section 1.1.1</title>
            <para>...</para>
            <list_1>...</list_1>
        </section>
    </section>
    <section>
        <title>Section 1.2</title>
        <para>...</para>
        <footnote>...</footnote>
    </section>
</section>
<section>
    <title>Section 2</title>
    <para>...</para>
    <list_1>...</list_1>
    <section>
        <title>Section 2.1</title>
        <para>...</para>
        <list_1>...</list_1>
        <list_2>...</list_2>
        <section>
            <title>Section 2.1.1</title>
            <para>...</para>
        </section>
    </section>
    <section>
        <title>Section 2.2</title>
        <para>...</para>
        <footnote>...</footnote>
    </section>
</section>

我也尝试了一段时间,根据原始解决方案找到了解决方案@JLRishe https://stackoverflow.com/a/16146259/2115381。所以我找到了一个,并喜欢将其放在这里作为一种可能性的答案。我希望有一个更容易理解的解决方案。


这是适用于任何航向深度的通用解决方案:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="xml" indent="yes" omit-xml-declaration="yes"/>
  <xsl:key name="kChildHeader" 
           match="/*/*[starts-with(local-name(), 'heading_')]"
           use="generate-id(preceding-sibling::*
                       [local-name() = 
                        concat('heading_', 
                               substring-after(local-name(current()), '_') - 1
                              )][1]
                            )"/>
  <xsl:key name="kChildItem" 
           match="/*/*[not(starts-with(local-name(), 'heading_'))]"
           use="generate-id(preceding-sibling::*
                             [starts-with(local-name(), 'heading_')][1])"/>

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

  <xsl:template match="/*">
    <xsl:copy>
      <xsl:apply-templates select="heading_1" />
    </xsl:copy>
  </xsl:template>

  <xsl:template match="*[starts-with(local-name(), 'heading_')]">
    <xsl:copy>
      <xsl:apply-templates select="key('kChildHeader', generate-id()) |
                                   key('kChildItem', generate-id())"/>
    </xsl:copy>
  </xsl:template>
</xsl:stylesheet>

当在示例输入上运行时,会产生:

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

创建一个分层的 xml 形式,形成一个类似于书籍描述的“平面”xml 的相关文章

随机推荐

  • 如何解决PHP扩展“0”必须加载的问题?

    我正在尝试在我的服务器上安装 Magento 我做了一切 正如文档中所写的 我有以下错误 必须加载 PHP 扩展 0 当我尝试在浏览器中的第二页上配置 Magento 时 会发生这种情况 你知道如何解决这个问题吗 如果您安装的是 Magen
  • PHP 表单从 id 发送值而不是值

    我通常在带有隐藏字段的表单中做类似的事情
  • 如何查找总和位于给定值范围内的整数数组中的所有有序元素对

    给定一个整数数组 查找数组中总和位于给定范围 a b 内的所有有序元素对的数量 这是一个 O n 2 的解决方案 counts all pairs in array such that the sum of pair lies in the
  • 在 JavaScript 中使用 Rails 变量时转义引号?

    我在尝试在 javascript 代码中使用 Rails 变量时遇到问题 例如 我可能定义一个 link to remote 带有参数 complete gt alert my var If my var I m testing 那么 ja
  • 任务似乎自动开始

    我正在移植一个加载时间很长的程序 当我移植它时 它根本没有得到改善 因为缓慢是因为访问数据库服务器 而不是次优代码 我已将加载移动到一个单独的线程上Tasks库 现在 UI 在加载时不会冻结 但它确实让我对某些事情感到好奇 The Task
  • 使用弹簧对安全休息控制器进行单元测试

    我有一个使用 Spring Boot 编写的非常小的 REST 应用程序 我想编写一个用于身份验证的单元测试 但即使我将 MockWithUser 添加到测试中 我也会收到 401 错误 重要的文件是 安全配置 Configuration
  • ptr_vector如何管理内存?

    我目前正在使用 c 使用 opengl 进行较低级别的编码 我来自一个沉重的 objc 背景 所以我对内存管理有一些了解 但我似乎无法理解 boost 库如何管理容器类型 例如ptr vector 我认为我的问题与我不知道如何ptr vec
  • 使用 dplyr 过滤包含部分列字符串的行

    假设我有一个像这样的数据框 term cnt apple 10 apples 5 a apple on 3 blue pears 3 pears 1 如何过滤此列中所有部分找到的字符串 例如得到结果 term cnt apple 10 pe
  • UnicodeEncodeError:在 UTF-8 语言环境中打印时,“ascii”编解码器无法对字符“\xe9”进行编码

    我正在清理 Europarl 的法语单语语料库 http data statmt org wmt19 translation task fr de monolingual europarl v7 fr gz http data statmt
  • 无法在fiddler中捕获jmeter流量

    我创建了 JMeter 记录 但当我开始测试时 我在 Fiddler 中没有看到任何请求 我改变了 Fiddler 中的端口号为 8080 我在 JMeter 中使用该端口号 Steps 创建线程组 将Http请求添加到线程组并输入URL
  • 从地址获取上一条指令的开头

    我们在缓冲区中查看 x86 操作码 标记当前指针 68 0F 00 6A 90 00 找到下一条指令的开始很容易 因为电流的大小是可以确定的 但是你如何才能准确地猜出前一个的开始呢 68 0F 00 6A 90 总共 5 个字节 结束于 0
  • 如何在 Google Composer 上重新启动气流服务器?

    当我需要在本地重新启动网络服务器时 我会这样做 ps ef grep airflow awk print 2 xargs kill 9 airflow webserver p 8080 D 我如何在 Google Composer 上执行此
  • 未能启用约束。一行或多行包含违反非空、唯一或外键约束的值。 VB.Net 中的错误

    StackOverFlow 中出现了三个类似的问题 但没有人给出答案 如果已找到发生此错误的原因但不知道解决方法 我在用Strongly Typed Dataset对于我的项目 它是作为 DAL 的 dll 创建的 我已使用设计器将 Sql
  • 我无法添加或删除课程

    我正在尝试删除一个类并在一个函数中添加一个类 但是当我点击按钮时什么也没有发生 这是我的代码 function unlikeVerhaal unlike unlike preventDefault document querySelecto
  • 如何使用 JavaScript 从表中的行索引获取行 id

    假设这是我的桌子 table tr td a td tr tr td b td tr table 如何使用表中的行索引获取行 ID 上面只是一个例子 其中 id 是静态的 但在我的例子中 我的 id 是动态的 所以我不能使用document
  • 一个编译器错误让我在 ActionScript 中感到困惑

    首先 我想解释一下 我对 ActionScript 不熟悉 所以不要因为一些基本的错误而责怪我 我刚刚学会了很短的时间 因此 编写 ActionScript 脚本的一些技巧总是值得赞赏的 我不知道编译器为什么说 我的一个类的构造函数不接受任
  • 在打字稿中使用 es-6 符号

    我正在尝试在我的打字稿代码中使用符号 使用 es 5 作为目标 但是 下面的代码会报错TS2304 找不到名称 符号 var sym Symbol 根据路线图 从 1 5 版本开始支持符号 但我想一件事是支持符号 另一件事是将符号转译为 e
  • MVC,模型可以保存/加载其数据吗?

    快速提问 我的数据模型是一个单例对象 它包含我想要存档的名称列表 我的想法是让模型负责加载和保存它自己的数据 该模型的load方法将被调用ViewController s viewDidLoad方法和save by the ViewCont
  • 只能创建一个cardNumber类型的元素

    我正在尝试显示我的条纹组件 但收到此错误 IntegrationError 只能创建一个类型为 cardNumber 的元素 我不知道为什么 因为我在整个应用程序中只使用了一次 有任何想法吗 这是我的索引 import ReactDOM f
  • 创建一个分层的 xml 形式,形成一个类似于书籍描述的“平面”xml

    这是一个后续问题 选择当前元素和当前元素的下一个元素之间的所有元素 https stackoverflow com q 16145859 2115381 即使我不确定创建一个新问题是否是正确的方法 但我还是这样做 因为原来的问题已经回答了