1

私の問題があります。

参照を使用し、他の XML ファイルを含む XML ファイルがあります。

XML ファイル (XSL で解析) :

<?xml version="1.0" encoding="utf-8"?>
<!ENTITY % references SYSTEM "myref.ref">
<test>
    <xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="file2.XML"/>
</test>

file2.XML :

<?xml version="1.0" encoding="utf-8"?>
<action>&testref;</action>

myref.ref :

<!ENTITY  testref 'cool ref there'>

XSL :

<?xml version="1.0" encoding="iso-8859-1"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
    <xsl:apply-templates select="//test"/>
</xsl:template>

<xsl:template match="test">
    <xsl:for-each select="document('file2.XML')//action">
    [...]
</xsl:template>

それから、参照 (myref.ref で参照) を含む file2.XML を開くために document() 関数を使用する XSL があります。

そのため、document('file2.XML') を使用すると、エンティティ "refentity" が参照されましたが、宣言されていないというエラーが表示されます。

document() を使用して他の XML を開くときに、myref.ref を使用するにはどうすればよいですか?

ありがとう。

4

1 に答える 1

1

「XMLファイル(XSLで解析)」と記載されているファイルはXMLではありません。エンティティー宣言が文書型宣言でラップされていれば XML になりますが、現在はそうではありません。あなたのXSLTプロセッサが文句を言っていないなら、あなたが示しているものではなく、もっと似たようなものを渡していると思います

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE test [
<!ENTITY % references SYSTEM "myref.ref">
]>
<test>
  <xi:include 
    xmlns:xi="http://www.w3.org/2001/XInclude" 
    href="file2.XML"/>
</test>

XInclude 仕様では、デフォルトで含まれるリソースが MIME タイプを持っているかのように解析されることが指定されていapplication/xmlます。DTD 処理のパフォーマンスまたは非パフォーマンスを明示的に無制限のままにします。XInclude プロセッサがそれに DTD 処理を実行する場合、インクルードする XML ドキュメントの DTD ではなく、XInclude ターゲットの DTD を使用することを期待します。つまり、XInclude プロセッサが、示されている入力を考慮して、実際に期待どおりの動作をしたかどうかは驚くべきことです。私のシステム上のlibxmlのコピーは、あなたが言及したエラーを発生させ、エンティティ「testref」が定義されていないと不平を言います。

一方で、あなたが望んでいるものは明らかに XInclude 仕様と互換性がないと主張するのは難しいことを認めなければなりません。結局、仕様は、「DTD または XML スキーマの検証が実行されるかどうかの詳細は、この仕様によって制約されない」と明示的に述べています。そのステートメントを考えると、XInclude 仕様では、含まれるリソースの DTD ではなく、含まれるリソースの DTD を使用して、含まれるリソースの DTD 処理を実行する必要があると主張するのは難しいでしょう。DTD 処理は、XInclude 仕様による制約を受けません。含まれているリソースを外部エンティティであるかのように解析することが間違っていることを証明する方法がわかりません。同様に、もちろん、xmllint は、宣言されていないエンティティーについて不平を言う場合、明らかに適合プロセッサーとしての権利の範囲内です。

XInclude の設計は明らかに外部エンティティを不要にする試みであるため、インクルードされたリソースを外部エンティティであるかのように解析することを決定したのは非常に珍しい実装です。(そして、含まれるリソースに独自の DTD がある場合、そのようなプロセッサは何をしますか? エラーを発行しますか? フォールバック処理を実行しますか?) 正しいかどうかは別として、ここで希望することを実行する XInclude プロセッサが見つかるとは思えません。私があなたなら、自分のデザインを再考します。

于 2013-06-06T01:38:26.383 に答える