id の代わりに XPath
テンプレートのタグとプロセッサを関連付けるには id を使いますが、その代替手段として XPath を使う方法があります。使うには mayaa ファイルで m:id="テンプレートの id" と書く代わりに m:xpath="XPath ロケーションパス"
と書きます。XPath に関する説明や参考資料はこのページの最後にあります。
m:id
同様、m:xpath
を付けるプロセッサは <m:mayaa>
タグの子として書かれているプロセッサに限定されます。(※1.1.10 以降)
簡単な例
テンプレートで id
属性を持たないタグのボディを置き換えてみましょう。XPath のロケーションパスで h1
タグを指定します。
<html>
<body>
<h1>Dummy</h1>
<p>content</p>
</body>
</html>
<?xml version="1.0" encoding="UTF-8"?>
<m:mayaa xmlns:m="http://mayaa.seasar.org">
<m:write m:xpath="/html/body/h1" value="Title" replace="false" />
</m:mayaa>
ルートはそのまま HTML のルートですので、 "/html/body/h1
" というロケーションパスは h1
タグを指します。
ブラウザで http://localhost:8080/mayaa/xpath.html にアクセスしてみましょう。
実行結果 (改行などは実際の実行結果と異なります)
<html>
<body>
<h1>Title</h1>
<p>content</p>
</body>
</html>
テンプレートに id
がなくても置き換わっているのがわかります。
複数のタグを一度に指定する
XPath では、複数のタグにマッチするロケーションパスを指定できます。複数のタグにマッチした場合、マッチしたすべてのタグがプロセッサに対応付けられます。
次の例では XPath のロケーションパスに "//a
" を指定しています。このパスはすべての a
タグにマッチしますので、すべての a
タグに target="_blank"
を追加します。
<html>
<body>
<ul>
<li><a href="path1.html">link1</a></li>
<li><a href="path2.html">link2</a></li>
<li><a href="path3.html">link3</a></li>
</ul>
</body>
</html>
<?xml version="1.0" encoding="UTF-8"?>
<m:mayaa xmlns:m="http://mayaa.seasar.org">
<m:echo m:xpath="//a">
<m:attribute name="target" value="_blank" />
</m:echo>
</m:mayaa>
ブラウザで http://localhost:8080/mayaa/xpath_multi.html にアクセスしてみましょう。
実行結果 (改行などは実際の実行結果と異なります)
<html>
<body>
<ul>
<li><a href="path1.html" target="_blank">link1</a></li>
<li><a href="path2.html" target="_blank">link2</a></li>
<li><a href="path3.html" target="_blank">link3</a></li>
</ul>
</body>
</html>
指定したロケーションパスにマッチするもの、つまりすべての a
タグに target="_blank"
が追加されているのが分かります。
XPath
XPath は XML 文書からノードを選択するための簡潔な言語で、「ロケーションパス」という表記を使ってノードを指定します。"/" 区切りでノードを選択する表記はロケーションパスの簡略表記です。Java2 SDK 5.0 から XPath を評価するための API (javax.xml.xpath) が提供されます。 XPath については参考文献をご覧ください。
参考文献
XML Path Language (XPath)
http://www.w3.org/TR/xpath
日本語訳: http://www.infoteria.com/jp/contents/xml-data/REC-xpath-19991116-jpn.htm