如何为document-node类型变量中<p>元素文本添加分号?
问题:为XML中
<p>元素文本末尾添加分号并生成document-node变量 需求
- 输入:类型为
document-node的变量cond_in,示例内容:
<entry attribute1="att1" attribute2="att2"> <p>Value1</p> <p>Value2</p> <p>Value3</p> </entry>
- 输出:同类型的
document-node变量cond_out,每个<p>元素的文本末尾添加;,示例内容:
<entry attribute1="att1" attribute2="att2"> <p>Value1; </p> <p>Value2; </p> <p>Value3; </p> </entry>
尝试的代码
<xsl:variable name="cond_out"> <xsl:apply-templates select="$cond_in" mode="addsymbol"/> </xsl:variable> <xsl:template match="entry" mode="addsymbol"> <xsl:copy-of select="entry"/> </xsl:template>
解决方案
可以通过XSLT的身份模板保留原XML结构,再专门匹配<p>的文本节点进行修改,代码如下:
<xsl:variable name="cond_out" as="document-node()"> <xsl:document> <xsl:apply-templates select="$cond_in/node()" mode="addsymbol"/> </xsl:document> </xsl:variable> <!-- 身份模板:复制所有未自定义匹配的节点、属性,保证原结构完整 --> <xsl:template match="@*|node()" mode="addsymbol"> <xsl:copy> <xsl:apply-templates select="@*|node()" mode="addsymbol"/> </xsl:copy> </xsl:template> <!-- 匹配<p>的文本节点,拼接分号 --> <xsl:template match="p/text()" mode="addsymbol"> <xsl:value-of select="concat(., '; ')"/> </xsl:template>
代码说明
- 用
as="document-node()"显式指定变量类型,结合<xsl:document>包裹处理结果,确保输出为标准的document-node类型 - 身份模板负责原样复制所有未修改的内容(比如
<entry>的属性、整体节点结构),避免手动复制每个节点的繁琐操作 - 专门匹配
p/text()的模板,将原文本与;拼接后输出,精准修改<p>的文本内容
内容的提问来源于stack exchange,提问作者Shud
相关产品推荐
相关产品推荐

