xslt - 关于 JAXP,XSLT和XML保留字符

  显示原文与译文双语对照的内容
0 0

看起来JAXP允许向文档节点分配任何值,包括 <。> 和&等。 使用保留的字符和XSLT来产生一个问题。 请考虑下面的代码:


DocumentBuilderFactory docFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder docBuilder = docFactory.newDocumentBuilder();
Document doc = docBuilder.newDocument();

...

Element field = doc.createElement("col");
field.setTextContent("<p>&]]" );
row.appendChild( field );

...

TransformerFactory factory = TransformerFactory.newInstance();
Source xslt = new StreamSource(new File("templateName.xsl"));
Transformer transformer = factory.newTransformer(xslt);

transformer.transform( new DOMSource(doc), new StreamResult(printer) );

现在如果我们有


<xsl:value-of select="col" disable-output-escaping="yes"/>

在" templatename.xsl"中,输出看起来像

 
"<p>&]]"

 

如果我们有这个


<xsl:value-of select="col"/>

输出将为


&lt;p&gt;&amp;]]

所以我的问题是,JAXP使用的内部数据表示方式是什么

 
"<p>&]]"

 

是否为文本节点不能是一个文本节点,也不能是CDATA节点。 什么必须为转换提供有效的XML文档,我相信。 另一方面,disable-output-escaping属性表明应该输出特殊字符,这意味着我们的"上校"节点是在代码中保存的。 那么XML文档是如何有效的?

时间: 原作者:

0 0

通常只有当转换的输出直接写入序列化程序时,disable-output-escaping才有效。 "禁用这里字符的转义"规范描述了数据模型的扩展,文本节点中的每个字符都有一个比较小的实例。

它在x00的实现中插入一个字符,而不是在Java中使用一个额外的比特,它将转换器从转换器传递到 switch escaping,这取决于在Java中的合法字符,而不是在XML中。

原作者:
0 0

好吧我想我已经知道了。 除非已经在CDATA节点中,否则任何保留的符号都必须被转义。 接下来,disable-output-escaping="是"属性将做什么取决于节点类型。 如果是文本节点,则将撤消 escaping,这样转换为"<"。 如果它是一个CDATA节点,它将禁用转义,并将CDATA输出为。 无论哪种情况,在文本节点中包含的所有标记都被剥离,同时保留为 CDATA ( 并根据disable-output-escaping逃跑) 。 因此DOMSource或者 Transformer ( 不确定将DOM呈现给 XML ) 将在转换( 而且CDATA保持完好) 之前对DOM文本节点进行实际转义。 因此对于文本节点,disable-output-escaping 应该读取 undo-xml-escaping,这解决了我的困惑。

总之多亏了Michael的解释 !

原作者:
...