【发布时间】:2017-04-13 08:23:44
【问题描述】:
我在使用 XPath 函数 unparsed-entity-uri() 检索未解析的实体 URI 时遇到了一些麻烦。
我使用SAXTransformerFactory 就像在"Efficient XSLT pipeline in Java" question 中一样,因为我需要执行一个转换链(即应用多个 XSLT 转换,并将转换的结果用作第二个转换的输入)。
感谢下面的代码,我发现我无法检索未解析的实体。 实际上它适用于 Xalan,但不适用于 Saxon-HE(版本 9.7.0) - 但我需要 Saxon,因为我更喜欢 XSLT 2.0(即使在下面的代码中没有任何特定于 XSLT 的内容2,只是为了举例)。如果我不使用 TransformerHandler,它也适用于 Saxon,例如stf.newTransformer(new StreamSource("transfo.xsl")).transform(new StreamSource("input.xsl"), new StreamResult(System.out)) 将产生所需的输出。
是否有我忘记的配置步骤?
// use "org.apache.xalan.processor.TransformerFactoryImpl" for Xalan
String transformerFactoryClassName = "net.sf.saxon.TransformerFactoryImpl";
SAXTransformerFactory stf = (SAXTransformerFactory) TransformerFactory.newInstance(transformerFactoryClassName,
LaunchSimpleTransformationUnparsedEntities.class.getClassLoader());
try {
TransformerHandler thTransf = stf
.newTransformerHandler(new StreamSource("transfo.xsl"));
// output the result in console
thTransf.setResult(new StreamResult(System.out));
// Launch transformation of input.xml
Transformer t = stf.newTransformer();
t.transform(new StreamSource("input.xml"),
new SAXResult(thTransf));
} catch (TransformerConfigurationException e) {
e.printStackTrace();
} catch (TransformerException e) {
e.printStackTrace();
}
在输入中,我有(对于 input.xml):
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE book
[<!ENTITY cover_hadrien SYSTEM "images/covers/cover_hadrien.jpg" NDATA jpeg>]>
<book>
<title>Les mémoires d'Hadrien</title>
<author>Marguerite Yourcenar</author>
<cover imgref="cover_hadrien" />
</book>
和一个示例 XSLT(用于 transfo.xsl):
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">
<xsl:template match="cover">
<xsl:copy>
<xsl:value-of select="unparsed-entity-uri(@imgref)"/>
</xsl:copy>
</xsl:template>
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
因此,我希望得到类似的结果:
<?xml version="1.0" encoding="UTF-8"?><book>
<title>Les mémoires d'Hadrien</title>
<author>Marguerite Yourcenar</author>
<cover>images/covers/cover_hadrien.jpg</cover>
</book>
但<cover> 在使用 Saxon 执行转换时为空。
【问题讨论】: