首页 > 解决方案 > 如何确保某些直系兄弟姐妹始终以特定顺序出现?

问题描述

我正在处理从公司内部桌面应用程序导出的 XML 文件(具体来说是TEI XML),我们称之为编辑器。我们使用编辑器制作古代文本的数字版本;我们输入/键入/复制+粘贴文本本身,并使用编辑器文本中的特殊文本块,我们还在该文本中输入各种附加信息,最相关的是:

输出 XML 的一般结构非常简单(减去命名空间):

<body>
<p>
text text text text text text
</p>
</body>

然后,附加信息将作为 XML 元素出现在文本中的适当位置,即:

例如:

<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)重新排序有问题的元素?

感谢您提供的任何建议。

标签: xmlxslt

解决方案


这听起来像是 (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> 

https://xsltfiddle.liberty-development.net/gWvjQgo


推荐阅读