You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何根据XML中gridSpan节点值为entry元素添加namest与nameend属性

XML转CALS标准table gridSpan跨列属性转换方案

核心调整逻辑

前提:你生成的tgroup下colspec节点的@colname已按c1、c2...cN的规则顺序命名。

  • 遍历每个row下的entry节点时,先记录当前entry在所属row的原生entry序列中的位置,计数从1开始
  • 检查当前entry的子节点是否存在<gridSpan>元素,若存在则获取其val属性的整数值N
  • 为当前entry添加两个属性:
    • namest 值为 c{当前entry的位置序号}
    • nameend 值为 c{当前entry的位置序号 + N - 1}
  • 移除当前entry下的<gridSpan>子节点,避免输出冗余内容

XSLT实现示例(最常用的XML转XML方案)

<!-- 匹配entry节点的模板 -->
<xsl:template match="entry">
    <xsl:variable name="currentPos" select="count(preceding-sibling::entry) + 1"/>
    <xsl:copy>
        <!-- 复制原有属性 -->
        <xsl:copy-of select="@*"/>
        <!-- 处理gridSpan逻辑 -->
        <xsl:if test="gridSpan">
            <xsl:variable name="spanVal" select="number(gridSpan/@val)"/>
            <xsl:attribute name="namest" select="concat('c', $currentPos)"/>
            <xsl:attribute name="nameend" select="concat('c', $currentPos + $spanVal - 1)"/>
        </xsl:if>
        <!-- 复制除gridSpan外的所有子节点 -->
        <xsl:copy-of select="node()[not(self::gridSpan)]"/>
    </xsl:copy>
</xsl:template>

其他工具通用逻辑(Python lxml为例)

from lxml import etree

def process_gridspan(row):
    # 遍历当前行的所有entry,计数从1开始
    for idx, entry in enumerate(row.xpath('./entry'), start=1):
        grid_span = entry.find('./gridSpan')
        if grid_span is not None:
            n = int(grid_span.get('val'))
            # 添加跨列属性
            entry.set('namest', f'c{idx}')
            entry.set('nameend', f'c{idx + n -1}')
            # 移除冗余gridSpan节点
            entry.remove(grid_span)

规则匹配验证

按上述逻辑处理后,完全符合要求的转换规则:

  • 第1个entry下的<gridSpan val="4"/> → 输出 <entry namest="c1" nameend="c4">
  • 第2个entry下的<gridSpan val="2"/> → 输出 <entry namest="c2" nameend="c3">
  • 第1个entry下的<gridSpan val="2"/> → 输出 <entry namest="c1" nameend="c2">

内容的提问来源于stack exchange,提问作者Kita Ansari

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 11:09:00