2

我有一个输入 XML,其中声明了实体。它看起来像这样:

<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE doctype PUBLIC "desc" "DTD.dtd" [ 

<!ENTITY SLSD_68115_jpg SYSTEM "68115.jpg" NDATA JPEG>
]>

DTD.dtd 文件包含必要的符号:

<!NOTATION JPEG SYSTEM "JPG" >

在 XSLT 转换期间,我想使用名称“SLSD_68115_jpg”获取实体中声明的 URI,如下所示:

<xsl:value-of select="unparsed-entity-uri('SLSD_68115_jpg')"/>

这样它就会返回类似“68115.jpg”的内容。

问题是它总是返回一个空字符串。我无法修改输入 xml。我知道这可能是我在互联网上发现的常见问题,但我还没有找到任何最终结论、解决方案或替代方案。

重要的是要注意我之前遇到过问题,因为我使用的是 StreamSource 并且必须手动设置诸如 systemId 之类的东西,我认为这可能是隐藏问题的地方。就像转换器无法解析具有给定 ID 的实体一样。

我正在使用 Xalan,我可能需要提供更多详细信息,但我不确定要添加什么,我会回答任何问题。

任何帮助将不胜感激。

4

2 回答 2

1

我发现了为什么“unparsed-entity-uri”无法解析声明的实体。这可能是一个特殊情况,但我会发布这个解决方案,这样它可能会为其他人节省很多时间。

我是(非常)XSLT 新手。然而,作为一名学生,我使用的 xsl 文件非常极端,其中包含多个导入语句和包含超过 5K 行代码的文件。

只是当我到达需要实体的地步时,转换器使用了一个不同的文档,该文档本质上是原始文档的子文档,这没关系,但是例如实体声明不会传递给子文档。因此,我无法使用该点以后的实体。

现在就像我说我是 XSLT 的新手,但我认为像这样的行可能会导致问题:

<xsl:apply-templates select="exslt:node-set($nodelist)"/>

因为在这之后,实体引用就不行了。

如果这是微不足道的,那么我很抱歉浪费了你的时间。

还是要感谢大家!

于 2013-03-07T09:31:32.913 回答
0

代替 a StreamSource,尝试SAXSource使用验证解析器配置的 a :

SAXParserFactory spf = SAXParserFactory.newInstance();
spf.setValidating(true);
spf.setNamespaceAware(true);
XMLReader xmlr = spf.newSAXParser().getXMLReader();

InputSource input = new InputSource(
    new File("/path/to/file.xml").toURI().toString());
// if you already have an InputStream/Reader then do
// input.setByteStream or input.setCharacterStream as appropriate
SAXSource source = new SAXSource(xmlr, input);

或者你可以用DOMSource同样的方式使用

DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
dbf.setValidating(true);
dbf.setNamespaceAware(true);
File f = new File("/path/to/file.xml");
Document doc = dbf.newDocumentBuilder().parse(f);

DOMSource source = new DOMSource(doc, f.toURI().toString());
于 2013-03-05T12:38:06.960 回答