如何从多个节点创建CDATA内容

时间:2014-06-10 12:21:33

标签: xml xslt

我的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以某种方式做到这一点?

2 个答案:

答案 0 :(得分:1)

XSLT样式表不知道(或关心)其输入XML文档中的文本是否表示为CDATA - 解析器处理它并且样式表只看到未打包的内容。所以它看到了

<note><![CDATA[test entry]]></note>

<note>test entry</note>

等同。同样,在输出端,您只需创建文本节点,然后由序列化程序决定是将它们编码为CDATA部分还是仅根据需要转义所有<&字符。您不能强制将某个特定文本节点输出为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>&#10;</xsl:text></xsl:if>
  <xsl:value-of select="concat(local-name(), ': ', .)"/>
</xsl:template>