我的XML看起来像这样
<Root>
<id>123</id>
<title>Inetgrate item</title>
<note><![CDATA[test entry]]></note>
<feedback><![CDATA[test entry]]></feedback>
<description><![CDATA[description of the records]]></description>
<owner>ABC</owner>
<integration_notes><![CDATA[steps for integration]]></integration_notes>
</Root>
我希望输出像这样
<Task>
<id>123</id>
<Summary>Inetgrate item</Summary>
<comments>
<![CDATA[note: test entry
feedback: test entry
integration_notes: steps for integration
]]></comments>
<description><![CDATA[description of the records]]></description>
<owner>ABC</owner>
</Task>
输出中“注释”节点中的CDATA是其他3个节点的串联。
我试图在XSLT(1.0)
中实现这一点是否可以通过XSLT以某种方式做到这一点?
答案 0 :(得分:1)
XSLT样式表不知道(或关心)其输入XML文档中的文本是否表示为CDATA - 解析器处理它并且样式表只看到未打包的内容。所以它看到了
<note><![CDATA[test entry]]></note>
和
<note>test entry</note>
等同。同样,在输出端,您只需创建文本节点,然后由序列化程序决定是将它们编码为CDATA部分还是仅根据需要转义所有<
和&
字符。您不能强制将某个特定文本节点输出为CDATA,但可以请求使用
<xsl:output method="xml" cdata-section-elements="comments description" />
位于样式表的顶层。
答案 1 :(得分:1)
使用
<xsl:output cdata-section-elements="comments description"/>
<xsl:template match="@* | node()">
<xsl:copy>
<xsl:apply-templates select="@* | node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="Root">
<Task>
<xsl:apply-templates select="@* | node()"/>
</Task>
</xsl:template>
<xsl:template match="note">
<comments>
<xsl:apply-templates select=". | ../feedback | ../integration_notes" mode="m1"/>
</comments>
</xsl:template>
<xsl:template match="feedback | integration_notes"/>
<xsl:template match="note | feedback | integration_notes" mode="m1">
<xsl:if test="position() > 1"><xsl:text> </xsl:text></xsl:if>
<xsl:value-of select="concat(local-name(), ': ', .)"/>
</xsl:template>