Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/342.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用XSLT保留特殊字符作为输出_Java_Xslt_Xslt 1.0_Html Entities - Fatal编程技术网

Java 使用XSLT保留特殊字符作为输出

Java 使用XSLT保留特殊字符作为输出,java,xslt,xslt-1.0,html-entities,Java,Xslt,Xslt 1.0,Html Entities,我面临的问题是,即使在XSLT转换之后,也要保留特殊字符。我的源XHTML文件包含几个特殊字符,如,&mdash,;在XSLT转换时,将忽略 我尝试了各种各样的答案,比如和 如果我手动将特殊字符的值更改为其相应的Unicode表示形式,则这些字符将保留在输出中 例如,将更改为 ,它会在输出中产生一个空格。请参考以下一些示例文件: 源XHTML: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http:

我面临的问题是,即使在XSLT转换之后,也要保留特殊字符。我的源XHTML文件包含几个特殊字符,如
&mdash
;在XSLT转换时,将忽略

我尝试了各种各样的答案,比如和

如果我手动将特殊字符的值更改为其相应的Unicode表示形式,则这些字符将保留在输出中

例如,将
更改为
 ,它会在输出中产生一个空格。请参考以下一些示例文件:

源XHTML:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:text="http://giraffe.wkle.com/text" xmlns:epub="http://www.idpf.org/2007/ops">
    <body>
        <div class="section" id="section_1">
            <p id="para_1" class="para">Content&nbsp;of&nbsp;paragraph&mdash;1.</p>
            <p id="para_2" class="para">Content&nbsp;of&nbsp;paragraph&mdash;2.</p>
        </div>
    </body>
</html>
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xs="http://www.w3.org/2001/XMLSchema">

    <xsl:output method="xml" indent="yes"/>
    <xsl:template match="node()|@*" name="identity">
        <xsl:copy>
            <xsl:apply-templates select="node()|@*" />
        </xsl:copy>
    </xsl:template>

    <xsl:template match="*[local-name()='p']/text()">
        <xsl:copy-of select="."/>
    </xsl:template>
</xsl:stylesheet>
<?xml version="1.0" encoding="UTF-8"?>
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:epub="http://www.idpf.org/2007/ops" xmlns:text="http://giraffe.wkle.com/text">
    <body>
        <div class="section" id="section_1">
            <p class="para" id="para_1">Content of paragraph—1.</p>
            <p class="para" id="para_2">Content of paragraph—2.</p>
        </div>
    </body>
</html>
<?xml version="1.0" encoding="UTF-8"?>
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:epub="http://www.idpf.org/2007/ops" xmlns:text="http://giraffe.wkle.com/text">
    <body>
        <div class="section" id="section_1">
            <p class="para" id="para_1">Contentofparagraph1.</p>
            <p class="para" id="para_2">Contentofparagraph2.</p>
        </div>
    </body>
</html>
[对问题早期版本的过时答案]

考虑使用Andrew Welch的Lexev实用程序。它基本上是对XML进行预处理,将实体引用转换为通过XML解析保留的内容,然后对转换结果进行后处理,将实体引用放回原处


我会去掉DOM代码。当您只想将DOM转换为其他对象时,创建DOM既笨拙又低效。如果您提供StreamSource或SAXSource并让它们决定自己的树表示,则Saxon和Xalan都会运行得更快。使用Saxon,速度可以提高5-10倍,并且使用的内存也会少得多


我不知道DOM为什么会丢失实体引用。您提供了关于正在使用哪个XSLT处理器的冲突信息,因此不容易调查,但因为DOM数据模型不同于XSLT/XPath数据模型(特别是在处理实体扩展方面)摆脱DOM应该可以解决这个问题。

使用Apache Commons Lang3 StringEscapUtils的解决方案。 图书馆:

    <dependency>
        <groupId>org.apache.commons</groupId>
        <artifactId>commons-lang3</artifactId>
        <version>3.0</version>
    </dependency>
我跳过了XML实体

我已短接EntityResolver,因为读取和处理实体(通过网络)需要很长时间。似乎您已经安装了类似的东西,因为实体没有被替换

在resolveEntity中,返回null以查看递归加载的DTD


或者,您可以安装一个XML目录,一个HTML实体DTD的本地缓存,其中有一些。

您在哪个平台上使用哪个XSLT处理器,您具体如何运行转换?我使用的是XSLT1.0,Apache Xalan处理器。我正在使用Java调用转换。请检查上面的更新。谢谢你的时间,迈克尔。该实用程序使用SAXON解析器,并从Java调用相同的解析器。我的规格不同。(我更新了我的问题。)你有没有只使用XSLT的方法可以帮助我解决这个问题?非常感谢,Joop!这个答案对我有用。现在我可以保留大部分的特殊角色了。你能详细解释一下答案吗,因为我是XSLT新手,很想知道我们实际上在做什么,特别是在这个-
source=source.replaceAll(“\\&”(amp|lt|gt|quot)”,“\u0001$1;”?当实体不是XML语法的一部分时,XML使用实体作为
&,,
&;,,,,&apos;
)。那些您不想用unescapethtml填充的实体,因为它们也是HTML实体。因此,在调用unescapeHtml之前,我用一个未使用的字符U+0001(也称为Ctrl-A)替换了符号和
&
。之后,它必须被撤销。
    <dependency>
        <groupId>org.apache.commons</groupId>
        <artifactId>commons-lang3</artifactId>
        <version>3.0</version>
    </dependency>
public static String processXHTML(String sourceFileName, String outputXhtml,
        String xslFilePath) throws ParserConfigurationException, SAXException, IOException,
        TransformerException {

    Charset charset = StandardCharsets.UTF_8;
    Path path = Paths.get(sourceFileName);
    String source = new String(Files.readAllBytes(path), charset);
    source = source.replaceAll("\\&(amp|lt|gt|quot);", "\u0001$1;");
    source = StringEscapeUtils.unescapeHtml4(source);
    source = source.replace('\u0001', '&');
    byte[] bytes = source.getBytes(charset);
    ByteArrayInputStream bais = new ByteArrayInputStream(bytes);

    DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
    DocumentBuilder docbuilder = factory.newDocumentBuilder();
    docbuilder.setEntityResolver(new EntityResolver() {
        @Override
        public InputSource resolveEntity(String publicId, String systemId)
                    throws SAXException, IOException {
            System.out.printf("resolveEntity PUBLIC %s SYSTEM %s%n", publicId, systemId);
            return new InputSource(new StringReader(""));
        }
    });
    //Document doc = docbuilder.parse(new FileInputStream(sourceFileName));
    Document doc = docbuilder.parse(bais);