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

如何合并首个与最后一个xref元素值?XSLT实现需求问询

XSLT 处理 xref-group 元素的解决方案

需求说明

保留首个带有完整属性的<xref>元素,将最后一个<xref>的文本内容与首个的文本拼接为[首个文本] through [最后一个文本]的形式,同时丢弃其余<xref>元素。

XML 输入

<?xml version="1.0" encoding="UTF-8"?>
<xref-group>
<xref id="SL116633052-196250" scope="external" type="pdf" format="pdf"
    href="Images/1166_1.pdf">Maintenance Update 2017-21</xref>
<xref id="SL116633052-196250" scope="external" type="pdf" format="pdf"
    href="Images/1166_2.pdf">Maintenance Update 2017-22</xref>
<xref id="SL116633052-196250" scope="external" type="pdf" format="pdf"
    href="Images/1166_3.pdf">Maintenance Update 2017-23</xref>
<xref id="SL116633052-196250" scope="external" type="pdf" format="pdf"
    href="Images/1166_4.pdf">Maintenance Update 2017-24</xref>
</xref-group>

预期输出

<xref-group>
   <xref id="SL116633052-196250" scope="external" type="pdf" format="pdf" href="Images/1166_1.pdf"/>
   <p>Maintenance Update 2017-21 through Maintenance Update 2017-24</p>
</xref-group>

(注:原预期输出的<xref>未闭合,不符合XML规范,此处调整为标准闭合形式)

现有代码问题分析

现有XSLT代码存在以下核心错误:

  • 模板匹配每个xref-group/xref,导致每个<xref>都会触发逻辑,多次输出through
  • xsl:copy-of select="not(preceding-sibling::xref)"复制的是布尔值(true/false),而非<xref>元素本身
  • 未实现文本内容的拼接逻辑,仅输出固定文本和无效的布尔值

修正后的XSLT代码

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xs="http://www.w3.org/2001/XMLSchema" exclude-result-prefixes="xs" version="2.0">

    <xsl:output encoding="UTF-8" indent="yes" method="xml"/>

    <!-- 身份模板:默认复制所有节点和属性 -->
    <xsl:template match="node()|@*">
        <xsl:copy>
            <xsl:apply-templates select="node()|@*"/>
        </xsl:copy>
    </xsl:template>

    <!-- 处理xref-group,自定义内部节点输出逻辑 -->
    <xsl:template match="xref-group">
        <xsl:copy>
            <!-- 输出首个xref元素,保留所有属性 -->
            <xsl:element name="xref">
                <xsl:copy-of select="xref[1]/@*"/>
            </xsl:element>
            <!-- 生成p标签,拼接首个和最后一个xref的文本 -->
            <p>
                <xsl:value-of select="concat(xref[1], ' through ', xref[last()])"/>
            </p>
        </xsl:copy>
    </xsl:template>

    <!-- 忽略所有原始xref元素,避免重复输出 -->
    <xsl:template match="xref-group/xref"/>

</xsl:stylesheet>

代码逻辑说明

  1. 身份模板保证非目标节点的默认复制行为
  2. 针对xref-group编写专属模板,控制内部内容输出:
    • 提取首个<xref>的所有属性,生成新的<xref>元素
    • 通过xref[1]和xref[last()]获取首尾<xref>的文本,用concat拼接并放入<p>标签
  3. 匹配所有原始<xref>元素并忽略,避免多余内容输出

内容的提问来源于stack exchange,提问作者Umaima Fatima

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 17:06:55