XSLT需求:仅解除entry元素中首个p元素的嵌套
解决DITA entry元素的p标签处理需求
以下是实现需求的XSLT代码,核心思路是通过身份转换模板保留文档原有结构,仅对entry元素做针对性处理:
<?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <!-- 身份转换模板:默认复制所有节点和属性,保证非目标元素结构不变 --> <xsl:template match="@*|node()"> <xsl:copy> <xsl:apply-templates select="@*|node()"/> </xsl:copy> </xsl:template> <!-- 专门处理entry元素 --> <xsl:template match="entry"> <xsl:copy> <!-- 根据entry内p元素的数量分支处理 --> <xsl:choose> <!-- 仅包含一个p元素:提取文本,丢弃p标签 --> <xsl:when test="count(p) = 1"> <xsl:value-of select="p/text()"/> </xsl:when> <!-- 包含多个p元素:提取第一个p的文本,保留后续所有p元素 --> <xsl:when test="count(p) > 1"> <xsl:value-of select="p[1]/text()"/> <xsl:apply-templates select="p[position() > 1]"/> </xsl:when> <!-- 无p元素的情况:直接保留原有内容 --> <xsl:otherwise> <xsl:apply-templates select="@*|node()"/> </xsl:otherwise> </xsl:choose> </xsl:copy> </xsl:template> </xsl:stylesheet>
代码说明
- 身份转换模板:确保DITA文档中除
entry外的所有元素、属性、文本都原样保留,不会破坏原有文档结构。 - entry元素处理逻辑:
- 单p场景:只输出p标签内的文本内容,移除p标签;
- 多p场景:保留第一个p的文本内容(移除其标签),后续的p元素完整保留;
- 无p场景:entry内原有内容不做任何修改。
测试验证
用你提供的输入示例测试,会生成预期输出:
输入:
<entry><p>Description</p></entry> <entry><p>Description2</p><p>Description3</p><p>Description4</p>
输出:
<entry>Description</entry> <entry>Description2<p>Description3</p><p>Description4</p>
内容的提问来源于stack exchange,提问作者Russ Urquhart
相关产品推荐
相关产品推荐

