应用xslt转换时,CData部分将丢失

时间:2013-07-05 18:48:11

标签: xslt cdata

我的xslt转换规则的一部分:

<xsl:if test="boolean(userSearch)">
    <xsl:copy-of select="userSearch"/>
</xsl:if>

在输入文件中我有:

<userSearch>
    <baseDn><![CDATA[ou=T10 Entitlement,dc=mycompany,dc=com]]></baseDn>
    <filter><![CDATA[(objectClass=person)]]></filter>
    <scope>SUBTREE</scope>
    <identifierAttribute><![CDATA[cn]]></identifierAttribute>
</userSearch>

在输出文件中,我有CDATA批次:

<userSearch>
  <baseDn>ou=T10 Entitlement,dc=mycompany,dc=com</baseDn>
  <filter>(objectClass=person)</filter>
  <scope>SUBTREE</scope>
  <identifierAttribute>cn</identifierAttribute>
</userSearch>

可能是什么原因?

1 个答案:

答案 0 :(得分:0)

好的。简短的回答是:

我们应在cdata-section-elements部分使用<xsl:output atrribute声明哪些标签包含CDATA。

基本上,我们应该在转换时将CDATA保存在其中,以确保我们想要安全的所有标记。

像这样:

<xsl:output
  method="xml"
  indent="yes"
  version="1.0"
  encoding="UTF-16"
  standalone="yes"
  cdata-section-elements="baseDn filter scope cn member"
/>

实际上,我在这里找到了这个答案:http://www.bernzilla.com/2008/02/12/utilizing-cdata-section-elements-in-xsl/


修改

在下面发表评论之后,我准备了一个小测试:

实际上CDATA DO有帮助,但并非适用于所有情况:

public class Escaping {

public static void main(String[] args) throws Exception {

    String result = "]]>/\\hello<>";  // this line is killing for CDATA if not escaping

    //result = StringEscapeUtils.escapeXml(result);  // we have to use escaping in any case

    String xml = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>";

    // CDATA does not help
    xml += "<tag><![CDATA[" + result + "]]></tag>"; // even if we  use CDATA

    //xml += "<tag>" + result + "</tag>"; // this is ok if 'result' is escaped

    System.out.println(xml);

    DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
    DocumentBuilder doc = dbf.newDocumentBuilder();
    doc.parse(new InputSource(new ByteArrayInputStream(xml.getBytes("utf-8"))));

    System.out.println("well formed");

}

}