2

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 を試しましたが、すべて同じ結果でした。

4

1 に答える 1

1

Saxon と Xalan (xsltproc については知りません) では、URIResolver を指定して document() リクエストを処理できます。これは、任意の Source オブジェクトを返すことができます。HTML 入力を処理するには、XMLReader が実際には HTML パーサーである SAXSource を返します。TagSoupvalidator.nuの 2 つの候補があります。後者は、HTML5 解析アルゴリズムを実装すると主張しているため、おそらくより優れています。XSLT プロセッサは、整形式の XML を処理していると認識します。

あるいは、Saxon にはsaxon:parse-html()拡張関数があります。実際、これはその下で TagSoup を使用しています。

于 2013-10-05T07:54:53.773 に答える