- PR -

XHTMLをXPathで検索するには?

1
投稿者投稿内容
りっちゃん
会議室デビュー日: 2002/05/24
投稿数: 3
投稿日時: 2002-05-24 12:44
みなさん、はじめまして。

いきなりですがどうしても分からないことがあります。
XHTMLとして作成したファイルを、XPathを用いてノード検索したいと考えている
のですが、うまくいきません。 下に例を示しますが・・・

== XHTML ==
<?xml version="1.0" encoding="Shift_JIS"?>
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja" lan="ja">
<body>
<div id="div1">##この部分をXPathで検索/取得したい!##</div>
</body>

== XPath ==
/html/body/div[@id='div1']

上記のようなパスでは検索できないのです。どうやら<html>タグで指定している
デフォルトのnamespaceが関係しているようなのですが、どうやってXPathで
表現するのか分かりません。

どなたか、XPathでデフォルトのnamespaceを指定する方法をご存じの方が
いらっしゃいましたら、ご教授をお願いします。
よねくら
常連さん
会議室デビュー日: 2002/04/24
投稿数: 29
投稿日時: 2002-05-24 14:44
例えば次のように書くことができます。

/*[local-name() = 'html']/*[local-name() = 'body']/*[local-name() = 'div'][@id = 'div1']


XSLTスタイルシート内でのXPathであるなら、このような書き方もあります。

<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:x="http://www.w3.org/1999/xhtml">

<xsl:template match="/">
<xsl:value-of select="/x:html/x:body/x:div[@id = 'div1']"/>
</xsl:template>

</xsl:stylesheet>
りっちゃん
会議室デビュー日: 2002/05/24
投稿数: 3
投稿日時: 2002-05-24 21:29
ご回答、ありがとうございます。

DOMノードを検索するために xalan の XPathAPIクラスで XPathを使おうと思って
いたんですが、結構めんどうな形式になってしまうんですね。

あまり長い形式だとプログラムソース上での実用性に欠けるので、htmlタグの
デフォルトnamespace を取ってしまう方向にしてしまいそうです (^^;
(XHTMLとよべない代物になってしまいますが....)

何か他にいい方法ないか、考えてみます。ご協力ありがとうございました。
ちいにぃ
大ベテラン
会議室デビュー日: 2002/05/28
投稿数: 244
投稿日時: 2002-05-29 16:32
動作未確認ですが、Xalan-Java2 の場合、

namespaceとそのprefixを設定するには、PrefixResolverインターフェイスを継承して、getNamespaceForPrefix メソッドを実装します。そして、それをXPathAPIに渡します。

cf. http://marc.theaimsgroup.com/?l=xalan-dev&m=100739564326979&w=2
(xml.apache.orgのxalan-devメーリングリスト)

さらに、default namespaceを設定するには、getNamespaceForPrefix の
引数 prefix が空 ("") のときに、該当のURIを返してやればいいようです。

cf. http://xml.apache.org/xalan-j/apidocs/index.html

なお、こちらではXalan-C++ 1.3で同じことを試しました。
namespace は扱えたのですが、default namespace はうまくいきませんでした。
apidocsにも触れられてないので、Xalan-C++ 1.3はdefault namespaceを扱えないの
かもしれません。


[ メッセージ編集済み 編集者: ちいにぃ 編集日時 2003-10-02 14:28 ]
1

スキルアップ/キャリアアップ(JOB@IT)