XSLT 1.0 を使用してウィキペディアのインフォボックスから情報を抽出し、特定のリンクについては、他のウィキペディア サイトから追加情報を取得します。
基本的に、ウィキペディアのページに対して返された HTML が無効でない限り、これは正常に機能します。残念ながら、これは、たとえばロシア語のウィキペディアのすべてのページで発生します。次の例を試してください
<xsl:for-each
select="document('http://ru.wikipedia.org/wiki/%D0%91%D0%B0%D0%B4%D0%B5%D0%BD_%D0%BA%D1%83%D0%BB%D1%8C%D1%82%D1%83%D1%80%D0%B0')//text()">
<xsl:value-of select="."/>
</xsl:for-each>
問題は、エンティティ ® がこの言語版のすべてのページで使用されていますが、宣言されていないことです: ウィキペディア ページの HTML 宣言が無効になっています。
<!DOCTYPE html>
代わりに、
<!DOCTYPE html SYSTEM "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
これは明らかに Wikipedia の問題であり、XSLT の問題ではありませんが、これらのサイトを解析するための回避策はありますか? より堅牢な XSLT パーサーへのポインターはありますか? HTML が解析される前にエンティティ宣言を HTML に注入する方法はありますか?
これまでのところ、XSLTproc、Saxon6.5.5、Saxon-B 9.1.0.8、および Xalan を試しましたが、すべて同じ結果でした。