多个CData到一个

时间:2014-11-02 15:33:29

标签: xml xslt-2.0

我试图通过使用xslt转换另一个xml来创建一个xml。 问题是:我使用的是多个" xsl:select的值= ...."在单个元素中,我将该元素标记为CData元素。我在转换后收到的值包含多个CData,而我希望它们都在一个CData中。

例如: 原始xml:

<test>
    <text1>WOW</text1>
    <text3>NO</text3>
</test>

xslt(上面有标题有&#34; Bla&#34;值为CData):

<?xml version="1.0" encoding="utf-8" ?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" >
    <xsl:output method="xml" cdata-section-elements="Bla" />
    <xsl:template match="/">
        <Bla id="bla">
            text<xsl:value-of select="test/text1" />moreText<xsl:value-of select="test/text3" />
        </Bla>
    </xsl:template>
</xsl:stylesheet>

输出xml:

<?xml version="1.0" encoding="UTF-8"?><Bla id="bla"><![CDATA[text]]><![CDATA[WOW]]><![CDATA[moreText]]><![CDATA[NO]]></Bla>

但是,我最终想要得到的是:

<?xml version="1.0" encoding="UTF-8"?><Bla id="bla"><![CDATA[textWOWmoreTextNO]]></Bla>

任何人都知道我需要改变才能实现这个目标吗?

谢谢!

1 个答案:

答案 0 :(得分:1)

我尝试了Saxon 6.5.5和Saxon 9.5的例子,它们都输出了一个CDATA部分

<?xml version="1.0" encoding="UTF-8"?><Bla id="bla"><![CDATA[
            textWOWmoreTextNO]]></Bla>

并且至少对于XSLT 2.0我认为http://www.w3.org/TR/xslt-xquery-serialization/#serdm带有“对于S5中相邻文本节点的每个子序列,将单个文本节点复制到新序列中,等于子序列中连接的文本节点的值按顺序。删除任何长度为零的文本节点。“规定应该合并创建的相邻文本节点,然后使用cdata-section-elements进行序列化,您应该获得单个CDATA部分。如果您使用的XSLT处理器没有这样做,那么就会在其上提交一个错误,因为解决方法是尝试使用xsl:value-of select="concat(...)"创建单个文本,例如<Bla id="bla"><xsl:value-of select="concat('text', test/text1, 'moreText', test/text3)"/></Blah>