如何合并首个与最后一个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>
代码逻辑说明
- 身份模板保证非目标节点的默认复制行为
- 针对
xref-group编写专属模板,控制内部内容输出:- 提取首个
<xref>的所有属性,生成新的<xref>元素 - 通过
xref[1]和xref[last()]获取首尾<xref>的文本,用concat拼接并放入<p>标签
- 提取首个
- 匹配所有原始
<xref>元素并忽略,避免多余内容输出
内容的提问来源于stack exchange,提问作者Umaima Fatima
相关产品推荐
相关产品推荐

