替换特殊字符,如– 和— 在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而言,它收到的内容包含而不是 ,它就是这样对待它的。