使用XSLT 3合并content至title并移除XML空行的技术实现请求
我帮你写了一份符合需求的XSLT 3样式表,完美解决你的转换问题,包括空行移除的处理——之前你提到的<xsl:template match="text()"/>会把所有文本内容都删掉,其实应该匹配仅包含空白字符的文本节点才对,具体内容如下:
完整XSLT 3转换代码
<?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet version="3.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <!-- 自动复制未专门处理的节点,简化文档结构保留逻辑 --> <xsl:mode on-no-match="shallow-copy"/> <!-- 移除所有仅含空白的文本节点,彻底消除空行 --> <xsl:template match="text()[normalize-space()='']"/> <!-- 核心处理:RECORD节点的title生成/修改逻辑 --> <xsl:template match="RECORD"> <xsl:copy> <xsl:choose> <!-- 存在title节点时,追加content内容 --> <xsl:when test="title"> <title> <xsl:value-of select="title/text() || '-' || content/text()"/> </title> </xsl:when> <!-- 不存在title节点时,新建title并填入content内容 --> <xsl:otherwise> <title> <xsl:value-of select="content/text()"/> </title> </xsl:otherwise> </xsl:choose> <!-- 保留RECORD下除title、content外的其他节点 --> <xsl:apply-templates select="*[not(self::title or self::content)]"/> </xsl:copy> </xsl:template> </xsl:stylesheet>
代码说明
<xsl:mode on-no-match="shallow-copy"/>:这是XSLT 3的简化语法,会自动复制所有我们没写模板处理的节点,不用手动写大量复制代码,节省工作量。- 空行移除逻辑:
text()[normalize-space()='']精准匹配那些只包含空格、换行、制表符的无效文本节点,删除它们就不会出现空行,比直接匹配所有文本节点合理得多。 - RECORD节点处理:
- 先复制RECORD节点本身,保证外层结构不变;
- 通过
<xsl:choose>判断是否存在title节点:- 有title时,用XSLT 3的字符串连接符
||把原title文本、-、content文本拼接起来,生成新的title; - 无title时,直接新建title节点并填入content的内容;
- 有title时,用XSLT 3的字符串连接符
- 最后保留RECORD下除了title和content之外的其他节点(如果需要保留content节点,把最后一行的
select条件改成*[not(self::title)]即可)。
示例效果
假设输入XML是:
<root> <RECORD> <title>产品介绍</title> <content>XX型号智能音箱,支持语音交互</content> <category>智能家居</category> </RECORD> <RECORD> <content>2024年度技术峰会将于10月召开</content> <date>2024-10-15</date> </RECORD> </root>
转换后的输出XML:
<root> <RECORD> <title>产品介绍-XX型号智能音箱,支持语音交互</title> <category>智能家居</category> </RECORD> <RECORD> <title>2024年度技术峰会将于10月召开</title> <date>2024-10-15</date> </RECORD> </root>
内容的提问来源于stack exchange,提问作者user13899632
相关产品推荐
相关产品推荐

