【问题标题】:CData section is lost when xslt transformation is applied应用 xslt 转换时 CData 部分丢失
【发布时间】:2013-07-05 18:48:10
【问题描述】:

我的 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>

可能是什么原因?

【问题讨论】:

  • 不确定这是否是重复的,所以我没有标记它......但你看过:stackoverflow.com/questions/2963633/… 吗?
  • 也许可以,但这个答案有点混乱。不确定它是否有帮助。

标签: xslt cdata


【解决方案1】:

好的..简短的回答是:

我们应该在&lt;xsl:output 部分中使用cdata-section-elements 属性声明哪些标签包含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/


编辑:

在下面有cmets之后我准备了小测试:

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

公共类转义{

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");

}

}

【讨论】:

  • 好吧,结束。但是,如果您使用 XML 输出方法(并且如果您没有努力克服它们),XSLT 处理器将始终生成格式良好的 XML 输出,因此 cdata-section-elements 属性是 not使这些元素对任意内容“安全”;它们已经是“安全的”,因为它们中的任何内容都不会使输出格式不正确。 cdata-section-elements 属性是指定如何序列化元素:使用 CDATA 部分,而不是根据需要转义左尖括号和 & 符号。
  • 我使用 CDATA 是因为我的 XML 看起来像这样: fgfh\/> 我认为在 XML 文件中有这样的数据是不安全的。不过,我的任务是:进行转换:如果以前版本的文件有 CDATA,那么转换后的版本也应该有 CDATA,以及数据本身。
  • @ses - 不一定。许多人倾向于滥用 CDATA 并且过于宽松地应用。如果内容/信息相同,则是否使用 CDATA 无关紧要。 XML 感知工具适用于 XML 信息集,而不是尖括号和字符。这就是您可以用实体引用替换特定字符的方式,它仍然“意味着”相同,并且将由 XML 工具进行相同的评估。
  • 如果您使用符合标准的 XML 工具,&lt;tag&gt;fgfhV&gt;&lt;/tag&gt; 是完全“安全”的;避免它是图腾主义。如果您使用的工具会破坏这样的输入,请丢弃它们,除非您出于充分的理由自己编写它们。
  • 如果我的 HTML 表单允许输入“
猜你喜欢
  • 2016-08-22
  • 1970-01-01
  • 1970-01-01
  • 2012-11-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多