2012-01-03 1 views
0

私はXMLにHTMLを表す文字列を持つノードがあるという問題に直面しています。 私はこの文字列をカットする必要がありますが、もちろん、これはinvalide HTML-Markup(例えば、文字を常に30文字後に切り捨てると、</ul>のような閉じ要素を簡単に失うことがあります。 どうすればよいですか? 私はGoogleを介して本当の助けを見つけることができないので、非常に難しいようです。XSLT:文字列をXMLノードセットとして解析します(具体的には、HTML-Stringをノードセットに変換します)?

これまでのところ、 "analyze-string"とregexでノードと内容を選択し、それらにes XML-element-nodesを書きます。 しかし、すべてのケース、特にネストしたノードを扱うには大きな問題が発生します。

誰かに考えがありますか? FYI

:私のメモ帳:

  1. 正規表現:最初のタグに正規表現の最初のノード
  2. プットタグ名の
  3. 読むのタグ名をキャッチし、全体のタグを検索し、(行くためにも、文字列の残りの部分を選択しますそれ以降に)
  4. 内容を確認:他のタグ?はい: - >ステップ1、無: - >ステップ5
  5. 書き込みタグノード要素として
  6. 文字列のテイクレスト - >ステップ1

ここでは、XML-docのです:私は何をしたいか

<?xml version="1.0" encoding="UTF-8"?> 
<html> 
    <data> 
     <![CDATA[ 
     <h2>header</h2><p>A little article. <b>Here</b> it's already done!</p> 
     ]]> 
    </data> 
</html> 

私は文字列(html)を持っていて、特別な量の文字を出力したいとします。最初の25)。 <p> -Tagではないので、私はHTML出力にこの文字列を入れて次のステップで

"<h2>header</h2><p>A little article" 

が、この時点で私は、無効なマークアップを取得します:私は単なる文字列でこれを行うと、私はこの結果を得ます閉まっている。

私の最初のアプローチ:この文字列を解析して各タグのXML-Nodesを取得し、各ノードに行き、xml要素を書き込んで(最後のタグが有効であることを確認します)、この例では25文字に制限されています。

+0

質問にXMLドキュメントを含めることができます。 – ColinE

+0

入力XMLを制御できますか? CDATAタグを使用していない場合は、可能性があります。 CDATAタグでは、HTML文字列はテキストの汎用文字列としてのみ扱われ、HTMLタグでは簡単に解析できません。 CDATAタグを削除してから、一致するタグを開始することができます... –

+0

あなたの質問を編集し、変換の結果を提供してください。どの文字列を "削除"したいのかははっきりしていません。 –

答えて

0

あなたがHTMLを表すXMLノードを持っている場合は、これがされている必要がありますエンティティはエンコードされた、すなわち開閉ブレースが&lt;&gt;に変換する - これはあなたが好きな場所にそれをカットし、まだ有効なXML文書を持っていることを意味します。

+0

はい、正しい。申し訳ありませんが、私は無効な出力、無効なHTMLドキュメント(ページの全面を閉じる要素がないと、ページ全体を破壊する可能性があるため)を避けたいので、十分にはっきりしませんでした。 –

0

analyze-stringと言えば、XSLT 2.0を使用しているようです。あなたは2つのオプションを持っています.Saxon 9では拡張機能http://www.saxonica.com/documentation/extensions/functions/parse.xml(さらにHTMLを解析したい場合はhttp://www.saxonica.com/documentation/extensions/functions/parse-html.xml)があります。デビッドカーライルの純粋なXSLT 2.0実装のHTMLパーサーhttp://code.google.com/p/web-xslt/source/browse/trunk/htmlparseがありますスタイルシートを作成し、データ要素の内容に使用します。

+0

非常に興味深い!私はスタイルシートを試してみましょう、ありがとう! (PS:はい、XSLT 2.0を使用しています) –

+0

David Carlisleの純粋なXSLT 2.0実装をテストしましたが、正しく動作させることができませんでした。 David Carlisleの正確な例でさえ、私のためにはうまくいきませんでした。だから私は考えを落とす。 :( –

関連する問題