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

I found out why the "unparsed-entity-uri" was unable to resolve the declared entities. This might be a special case, but I will post this solution so it might save someone else a lot of time.

I'm (very) new to XSLT. The xsl file I got to work with however as a student was pretty extreme with multiple import statements and files containing more than 5K lines of code.

Simply by the time I got to the point where I needed the entities the transformator used a different document that was essentially the sub document of the original one, which is okay, but for example the entity declarations are not passed to the sub document. Therefore there is no way for me to use the entities from that point beyond.

Now like I said im new to XSLT but I think that for example lines like this can cause the problem:

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

Because after this, entity references are no bueno.

If this was trivial then my apologies for waisting your time.

Thanks to everyone none the less!

于 2013-03-07T09:31:32.913 に答える
0

の代わりに、検証パーサーで構成された をStreamSource試してください。SAXSource

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または、同じ方法でa を使用できます

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 に答える