如何使用XSLT将节点/元素作为属性添加到XML节点
解决XHTML转XML时将div.cmp-text内容转为属性值的问题
需求概述
需要将XHTML文档转换为指定格式的XML,核心要求是把XHTML中div.cmp-text节点的完整内容(包含嵌套标签)作为目标XML元素的属性值。
初始实现的问题
直接编写的XSLT 1.0代码无法实现该需求,因为XSLT 1.0中如果直接将节点集赋值给属性,只会提取节点集中的文本内容,而非完整的标记结构。
解决方案:使用xml-to-string模板序列化节点
通过导入一个xml-to-string模板,将div.cmp-text节点序列化为字符串形式,再将该字符串作为属性值赋值给目标XML元素。
xml-to-string模板代码
<xsl:template name="xml-to-string"> <xsl:param name="node"/> <xsl:variable name="temp"> <xsl:copy-of select="$node"/> </xsl:variable> <xsl:value-of select="document('')//xsl:variable[@name='temp']/*"/> </xsl:template>
主XSLT代码示例
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <!-- 导入xml-to-string模板 --> <xsl:import href="xml-to-string.xsl"/> <xsl:template match="/"> <target-element> <!-- 调用模板将div.cmp-text转为字符串,作为属性值 --> <xsl:attribute name="content"> <xsl:call-template name="xml-to-string"> <xsl:with-param name="node" select="//div[@class='cmp-text']"/> </xsl:call-template> </xsl:attribute> </target-element> </xsl:template> </xsl:stylesheet>
预期输出
假设输入的XHTML包含:
<div class="cmp-text"> <p>这是一段<strong>加粗</strong>的文本</p> </div>
转换后的XML输出为:
<target-element content="<p>这是一段<strong>加粗</strong>的文本</p>"/>
内容的提问来源于stack exchange,提问作者Bimbisar
相关产品推荐
相关产品推荐

