如何根据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
相关产品推荐
相关产品推荐

