2014-11-02 52 views
0

我想通过使用xslt转换另一个xml来创建一个xml。 问题是:我在单个元素中使用了多个“xsl:select value = ...”的值,并将该元素标记为CData元素。我在转换后收到的价值包括多个CData,但我希望它们都在单个CData中。多个CData到一个

例如: 原始XML:

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

XSLT(上面有头有 “布拉” 值为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

您使用哪种XSLT处理器?您是否尝试用例如''?但是你的结果很奇怪,XSLT处理器是这​​样做的吗? – 2014-11-02 15:38:17

+0

我用我的java代码(使用javax.xml.transform.TransformerFactory)和使用Altova XMLSpy尝试了它。 – APT 2014-11-02 15:40:08

+0

也,你给我的例子很棒! 如果没有更好的解决方案。我会用它。 谢谢:) – APT 2014-11-02 16:23:09

回答

1

我试图与撒克逊6.5.5和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>

+0

它工作(使用撒克逊)!谢谢 :) – APT 2014-11-03 12:37:58