从 XSLT 2 中元素值的语义层次结构创建父子元素

2023-11-29

我在 XML 内容中有一系列 P 标记,它们在其初始值内具有语义层次结构,但是,P 标记是线性的。寻找 XSLT 2 转换。

语义层次如下:

(1)
 +-(a)
    +-(I)
       +-(A)

正则表达式序列如下:

<xsl:param name="patternOrder" as="element(pattern)*" xmlns="">
  <pattern level="1" value="^(\([0-9]+(\.[0-9]+)?\))" />
  <pattern level="2" value="^(\([a-z]\))" />
  <pattern level="3" value="^(\((IX|IV|V?I{{0,3}})\))" />
  <pattern level="4" value="^(\([\w]+(\.[\w]+)?\))" />
</xsl>

审查我的数据集后,我有各种条件:

<?xml version="1.0" encoding="UTF-8"?>
<test>
    <content>
        <p>(1) blah</p>
        <p>(2)(a) blah</p>
        <p>(b) blah</p>
        <p>(3)(a)(I) blah</p>
        <p>(II) blah</p>
        <p>(A) blah</p>
        <p>(B.1) blah</p>
        <p>(b) blah</p>
        <p>(4) blah</p>
        <p>(4.5) blah</p>
        <p>(5)(a)(I)(A) blah</p>
        <p>(B) blah</p>
        <p>(II) blah</p>
        <p>(III)(a) blah</p>
        <p>(bb.2) blah</p>
        <p>(6) blah</p>
    </content>
    <content>
        <p>blah</p>
    </content>
    <content>
        <p>blah</p>
        <p>(1) blah</p>
        <p>(a) blah</p>
        <p>(b) blah</p>
        <p>(2) blah </p>
    </content>
</test>

...最终结果应该是:

<?xml version="1.0" encoding="UTF-8"?>
<test>
    <content>
        <p>(1) blah</p>
        <p>(2)
            <p>(a) blah</p>
            <p>(b) blah</p>
        </p>
        <p>(3)
            <p>(a)
                <p>(I) blah</p>
                <p>(II) blah
                    <p>(A) blah</p>
                    <p>(B) blah</p>
                </p>
            </p>
            <p>(b) blah</p>
        </p>
        <p>(4) blah</p>
        <p>(4.5) blah</p>
        <p>(5)
            <p>(a)
                <p>(I)
                    <p>(A) blah</p>
                    <p>(B.1) blah</p>
                </p>      
                <p>(II) blah</p>
                <p>(III)</p>
                    <p>(a) blah</p>
                    <p>(bb.2) blah</p>
                </p>
            </p>
        <p>(6) blah</p>
    </content>
    <content>
        blah
    </content>
    <content>
        blah
        <p>(1) blah
            <p>(a) blah</p>
            <p>(b) blah</p>      
        </p>
        <p>(2) blah </p>
    </content>
</test>

请注意,如果 P 标签中不存在语义层次结构,则 P 标签将被删除,并且是其父内容元素的值。

EDIT:

我已经能够使用以下正则表达式检测所有语义条件:

^(\(([\w]+(\.[\w]+)?)\)){1,4}

*编辑 #2 *

具有练级属性:

<?xml version="1.0" encoding="UTF-8"?>
<test>
    <content>
        <p level="1">(1) blah</p>
        <p level="1">(2)</p>
        <p level="2">(a) blah</p>
        <p level="2">(b) blah</p>
        <p level="1">(3)</p>
        <p level="2">(a)</p>
        <p level="3">(I) blah</p>
        <p level="3">(II) blah</p>
        <p level="4">(A) blah</p>
        <p level="4">(B.1) blah</p>
        <p level="2">(b) blah</p>
        <p level="1">(4) blah</p>
        <p level="1">(4.5) blah</p>
        <p level="1">(5)</p>
        <p level="2">(a)</p>
        <p level="3">(I)</p>
        <p level="4">(A) blah</p>
        <p level="4">(B) blah</p>
        <p level="3">(II) blah</p>
        <p level="3">(III)</p>
        <p level="2">(a) blah</p>
        <p level="2">(bb.2) blah</p>
        <p level="2">(6) blah</p>
    </content>
    <content>
        <p>blah</p>
    </content>
    <content>
        <p>blah</p>
        <p level="1">(1) blah</p>
        <p level="2">(a) blah</p>
        <p level="2">(b) blah</p>
        <p level="1">(2) blah </p>
    </content>
</test>

第一阶段:转型

<p>(2)(a) blah</p>
<p>(b) blah</p>

into

<p>(2)</p>
<p>(a) blah</p>
<p>(b) blah</p>

使用类似的东西

<xsl:template match="p">
  <xsl:for-each select="tokenize(., '\(')">
     <xsl:if test="normalize-space(.)">
       <p>(<xsl:value-of select="."/></p>
     </xsl:if>
  </xsl:for-each>
</xsl:template>

第二阶段:

首先写一个函数

<xsl:function name="f:level" as="xs:integer">
  <xsl:param name="p" as="element(p)"/>
  ....
</xsl:function>

它根据匹配您的正则表达式来计算“语义级别”。您似乎知道如何完成这部分。

然后写一个递归分组函数:

<xsl:function name="f:group" as="element(p )*">
  <xsl:param name="in" as="element(p )*"/>
  <xsl:param name="level" as="xs:integer"/>
  <xsl:for-each-group select="$in" group-starting-with="p[f:level(.)=$level]">
    <p><xsl:value-of select="current-group()[1]"/>
      <xsl:sequence select="f:group(current-group()[position() gt 1], $level+1)"/>
    </p>
  </xsl:for-each-group>
</xsl:function>

并像这样调用这个函数:

<xsl:template match="content">
  <xsl:sequence select="f:group(p, 1)"/>
</xsl:template>

未测试。

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

从 XSLT 2 中元素值的语义层次结构创建父子元素 的相关文章

随机推荐

  • 检测 HTML5 Canvas 上的线条描述的区域

    从 HTML5 画布上的二维网格开始 用户通过绘制点来创建线 最多 5 条线 接下来 用户可以选择网格上的另一个任意点 并且该区域会突出显示 我需要获取该点并定义一个多边形来填充用户创建的线条所描述的区域 所以我的想法是 我需要检测围绕任意
  • php: echo ('x' == 0) 打印 1(真)。它是否正确?

    我和我的朋友在调试应用程序时发现了这个 此代码打印 1 因此 x 等于 0 这是正确的 有人可以解释为什么会这样吗 我想可能是我不明白 php 规则中的某些内容 或者可能是一个错误 谢谢 使用 类型杂耍 将字符串转换为数字 这显示在文档 t
  • Jupyter笔记本,将单元从一个笔记本移动到一个新笔记本中

    是否可以将 n 个单元从一台笔记本移动到另一台新笔记本 以编程方式将 n 个单元从一台笔记本移动到新笔记本 是的 您可以使用nbformat取出一个笔记本 并将新笔记本的内容限制为原始笔记本的 n 个单元格的块 nbformat 包允许您以
  • 调用 C# COM 对象

    好的 我创建了一个 c dll 将其所有接口和方法全部设为 ComVisible true 使用 gacutil 将其添加到 GAC 然后使用 regasm 注册它并创建类型库 tlb 文件 现在我有另一个 c 项目 我想调用该 com 对
  • 如何从 Power Query 中的上一行获取列值?

    我想从前一行获取一个值 我按照中的建议尝试了以下代码这个帖子 Table AddColumn Added index custom column each Index 1 column name 但它会抛出这个错误 Cannot use f
  • Python:使用 webbrowser-control 更改网络浏览器的 url

    好的 我知道如果你想使用 python 打开特定的 url 你可以运行 import webbrowser webbrowser open buinvent com 但是 如果您想在 Web 浏览器中将其更改为不同的 url 而不在 Web
  • 在我的班级中实现 Thread Android?

    我想知道如何在此类中实现线程以使其免受ANR 应用程序无响应 问题的影响 public class myClass private static String LOG TAG Root class getName public boolea
  • 奇怪的 JavaScript 习惯用法 - “/xyz/.test(function(){xyz;})” 是做什么的?

    John Resig 写了一个漂亮的类函数 时髦 我试图弄清楚发生了什么事 并且几乎所有事情都弄清楚了 除了一行 fnTest xyz test function xyz b super b 有几件事立即跳入我的脑海 首先xyz从未被初始化
  • 转换后的图像不清楚。 .wmf 转 png

    我正在尝试使用 c net 将 wmf 图像文件转换为 png 格式 但是 保存的图像不清楚 my code Metafile img new Metafile test wmf MetafileHeader header img GetM
  • VueJS从父组件访问子组件的数据

    我正在使用webpack 的 vue cli 脚手架 我的 Vue 组件结构 层次结构当前如下所示 App PDF Template 背景 动态模板图像 静态模板图像 Markdown 在应用程序级别 我想要一个 vuejs 组件方法 可以
  • 在Python中按(n个)块迭代迭代器?

    你能想出一种好方法 也许使用 itertools 将迭代器分割成给定大小的块吗 所以l 1 2 3 4 5 6 7 with chunks l 3 成为迭代器 1 2 3 4 5 6 7 我可以想到一个小程序来做到这一点 但也许不是 ite
  • Lein Clojure 1.3 与 Clojure 1.2.1

    我承认这个问题的措辞有点糟糕 请让我知道我应该运行哪些命令来提供更多信息 我会提供它 背景 我使用 Clojure 已有约 1 年了 主要只是通过clojure repl 现在 我开始使用 Lein 然而 leon 不喜欢我的一些代码 这是
  • 如何使用php检索特定文件夹中的所有文件名

    比如说 在我的网络服务器中有一个名为 upload files 的文件夹 然后我的 php 页面之一应该获取该文件夹中的所有文件名 我已经用谷歌搜索过 但到目前为止返回的文件名只是用户浏览的页面 谢谢 有很多方法可以检索文件夹内容 例如gl
  • CodeIgniter - 使用一个输入上传多个文件

    我正在尝试上传几个文件立即从1个输入
  • 如何创建一个无论字符序列如何都匹配的正则表达式?

    假设我要求用户输入所提供的某些单词 他 只会将其输入到将被验证的文本框中不管我已经寻找答案几个小时了 但我被困住了 例如应输入的单词是 foo bar green 即使订单是 我仍然可以匹配它绿富酒吧 or 绿色Foo酒吧 我非常了解正则表
  • 如何在 EF Core 2.1.0 中设置管理员用户?

    我有一个使用 EF Core 2 1 0 的 ASP NET Core 2 1 0 应用程序 如何使用管理员用户播种数据库并赋予他 她管理员角色 我找不到任何关于此的文档 As user cannot be seeded in a norm
  • Android - ListView:复选框未保持选中状态

    我有一个列表视图 大约有 200 个项目 我为复选框实现了一个自定义 ArrayAdapter 我使用 SparseBooleanArray 来存储框的值 所有这些工作正常 但我似乎无法以图形方式更新复选框的检查 如果用户单击 则该框被选中
  • 链接两个 D3 图

    我正在尝试链接两个 D3 图 以便选择右侧直方图的一部分 导致某个散点图显示在左侧 This是我的尝试 我当前的问题是为什么正确的图没有渲染 我认为这可以追溯到如何在 d3 中创建和引用多个 SVG 标签 D3 有针对这种情况的 SVG 控
  • 使用包将 Python 类拆分为多个模块

    我在 python 中编写了一些代码作为一个类 但现在我正在尝试将其作为包分发 但我在弄清楚不同的部分应该如何组合在一起时遇到了一些麻烦 因此 当我最初编写代码时 我有一个包含一些函数的类 其中包括 init 功能 我现在已将每个函数拆分为
  • 从 XSLT 2 中元素值的语义层次结构创建父子元素

    我在 XML 内容中有一系列 P 标记 它们在其初始值内具有语义层次结构 但是 P 标记是线性的 寻找 XSLT 2 转换 语义层次如下 1 a I A 正则表达式序列如下