替换特殊字符,如– 和— 在xml文档中出现相应的代码,如– 等等
我想替换像&ndash这样的特殊字符; 和— 在xml文档中出现相应的代码,如– 等等
我有一个包含几个特殊字符的输入xml文档
The war was between1890–1900 something—something else
还有其他几个像’ 单引号
我的xslt代码如下
..... .....
我解析的java代码如下(我正在使用saxon9。)
package com.xsltprocessor; import java.io.File; import java.io.FileInputStream; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.transform.Source; import javax.xml.transform.Templates; import javax.xml.transform.Transformer; import javax.xml.transform.TransformerFactory; import javax.xml.transform.stream.StreamResult; import javax.xml.transform.stream.StreamSource; import org.w3c.dom.Document; public class ParseUsingSAX { public ParseUsingSAX() { } public void parseBookContent(String xsltFile) { try { //File inputXml = new File("D:\\data\\myxml.0f"); File xslt = new File(xsltFile); TransformerFactory factory = TransformerFactory.newInstance(); Templates template = factory.newTemplates(new StreamSource(new FileInputStream(xslt))); Transformer xformer = template.newTransformer(); Source source = new StreamSource(new FileInputStream(inputXml)); StreamResult result = new StreamResult(); xformer.transform(source,result); System.out.println("DONE"); } catch (Exception ex) { // TODO Auto-generated catch block ex.printStackTrace(); System.out.println("IO exception: " + ex.getMessage()); } }
}
我在转换后获得输出
The war was between1890–1900
预期产出
The war was between1890–1900
使用控制输出序列化的xsl:character-map
元素。
你还必须申报
作为确保使用字符映射的顶级元素。
正如我在评论中提到的, –
是一个需要在XSLT中声明的HTML命名实体。 有关详细信息,请参阅此讨论。
嵌入到您显示的样式表中(这会输出虚拟字符串“MDASH”和“NDASH” – 仅用于说明):
]>
请注意,这对使用xsl:result-document
生成的输出没有影响(因为您没有显示整个样式表)。 有关角色地图的更多信息,请参阅我之前的答案和官方建议 。
在提到的DTD将包含所使用的实体引用(如
–
)或者它是错误的(或者我认为输入XML在尝试使用实体时可能出错了它应该能够使用)。
如果它确实包含它们,那么您需要设置XSLT处理器以根据其DTDvalidation文档。 (我不知道如何在你的情况下这样做,因为我知道问题的XSLT部分,但不知道如何在Java中使用XSLT的具体细节)。
如果没有,你将不得不修复它。
获取http://www.w3.org/2003/entities/2007/w3centities-f.ent
的副本(虽然它只能引用该URI本身,如果你没有,W3会更喜欢,而你’这样没有更好的表现)。
然后创建自己的bookfull.dtd,其中包括:
%w3centities-f;
或者,它直接在DTD中包含该文件的内容。
现在,在解释输入文档时,可以解析实体引用。 例如, –
在上面的定义是:
或者换句话说; “无论何时–
出现,用–
替换它”。
这种情况发生在运行XSLT样式表之前的XML解析步骤中,因此就XSLT而言,它收到的内容包含–
而不是–
,它就是这样对待它的。