xml - 如何确保某些直系兄弟姐妹始终以特定顺序出现?
问题描述
我正在处理从公司内部桌面应用程序导出的 XML 文件(具体来说是TEI XML),我们称之为编辑器。我们使用编辑器制作古代文本的数字版本;我们输入/键入/复制+粘贴文本本身,并使用编辑器文本中的特殊文本块,我们还在该文本中输入各种附加信息,最相关的是:
- 版本参考
- 同步标记
- 仪器(=脚注)
输出 XML 的一般结构非常简单(减去命名空间):
<body>
<p>
text text text text text text
</p>
</body>
然后,附加信息将作为 XML 元素出现在文本中的适当位置,即:
- 版本参考:
<emph id="11.1">11.1</emph>
或<note place="left">Bad. 41</note>
- 同步标记:
<anchor type="sync2"/>
- 仪器(=脚注):
<seg xml:id="wXX">someword</seg>
例如:
<p>
Lorem ipsum dolor sit amet, consectetur adipiscing elit, <anchor type="sync2"/>sed do <emph id="11.1">11.1</emph>eiusmod <seg xml:id="wXX">tempor</seg> incididunt
</p>
问题是编辑器最初设计用于生成漂亮的 PDF,其中每一个都出现在页面的特定位置,因此它们在编辑器中的顺序无关紧要;因此,它们也在 XML 文件中以或多或少的随机顺序导出。
这对于 XML 结构来说不是问题,因为它们都是子级<p>
和兄弟级。但是当我将 XML 转换为 HTML 以供在线使用时,它确实会带来问题:只要它们之间有文本,一切都很好。但是每当他们(至少其中两个)相遇/彼此跟随/是直接兄弟姐妹时,他们必须以特定的顺序出现,即<emph>
/ <note>
> <sync>
> <seg>
。
我的问题是,我能否实现这一点,即在必要时仅使用 XSLT(1.0 或 2.0)重新排序有问题的元素?
感谢您提供的任何建议。
解决方案
这听起来像是 (inside xsl:template match="p"
)的任务
<xsl:for-each-group select="node()" group-adjacent="boolean(self::emph | self::note | self::anchor | self::seg)">
<xsl:choose>
<xsl:when test="current-grouping-key()">
<xsl:copy-of select="current-group()[self::emph], current-group()[self::note], current-group()[self::anchor], current-group()[self::seg]"/>
</xsl:when>
<xsl:otherwise>
<xsl:copy-of select="current-group()"/>
</xsl:otherwise>
</xsl:choose>
</xsl:for-each-group>
推荐阅读
- c# - 搜索所有文件夹和子文件夹
- arrays - 反应推送数组到状态
- javascript - 将表格行复制到剪贴板 - 仅复制第一页
- c++ - 是否可以保存带有参数的函数指针以供以后使用?
- python - 循环遍历 2 个 numpy 数组并将它们连接起来
- uwp - 将 xBind 与 MapElementLayer 一起使用
- python - Paramiko 如何等到 cmd 完成。(不能使用 exec_command)
- javascript - JavaScript 中两个深层对象的交集
- java - Kotlin 将注解作为参数传递给注解
- stored-procedures - 如何在 Entity Framework Core 2.1 中将空参数传递给上下文查询类型