質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
XPath(XML Path)

XML Path Language (XPath; XMLパス言語)は、マークアップ言語 XML に準拠した文書の特定の部分を指定する言語構文の事をいいます。XPathはXMLとは別の構文を使用します。XMLドキュメントの抽象、論理ストラクチャ上で動作します。

XSLT

XSLTは、組み立てられた文書を(XML、HTML、そしてプレーンテキストのような)別のフォーマットに変化する為にデザインされたXMLの為の変換用言語です。

Q&A

解決済

1回答

959閲覧

xsl:paramで取得した変数を要素名として指定したい

crossism

総合スコア16

XPath(XML Path)

XML Path Language (XPath; XMLパス言語)は、マークアップ言語 XML に準拠した文書の特定の部分を指定する言語構文の事をいいます。XPathはXMLとは別の構文を使用します。XMLドキュメントの抽象、論理ストラクチャ上で動作します。

XSLT

XSLTは、組み立てられた文書を(XML、HTML、そしてプレーンテキストのような)別のフォーマットに変化する為にデザインされたXMLの為の変換用言語です。

0グッド

0クリップ

投稿2018/06/28 17:16

編集2018/06/30 01:41

本のデータを持つxmlファイルを、xsltによってhtmlに変換し、RubyのCGIを使ってページ遷移をしています。
xmlファイルに、要素itemの子要素としてtitle,creator,price,...等があるとします。
また、xsltにおいて<xsl:param name="category" /><xsl:param name="word" />という風に二つの変数を用意します。遷移前のページから受け取った検索ワードです(正しく受けとれているのは確認できています)。
ここで、要素名が$categoryでその要素の文字列に$wordを含むitemをselectしようとしています。

xsl:chooseを使った次のコードは、意図した動作をします。

<xsl:choose> <xsl:when test = "$category='title'"> <xsl:apply-templates select="/books/item[contains(title,$word)]" /> </xsl:when> <xsl:when test = "$category='creator'">   <xsl:apply-templates select="/books/item[contains(creator,$word)]" /> </xsl:when> </xsl:choose>

これと同じ動作をするコードをより短く記述できないかと試みているのですが、次のコードではうまくいきません。

<xsl:apply-templates select="/books/item[contains((local-name()=$category),$word)]" />

改良の余地がありましたら是非教えていただきたいです。よろしくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

以下のコードで動くと思います.お試しください.

xml

1 2<xsl:apply-templates select="/books/item[*[local-name() = $category][contains(.,$word)]]" />

ポイントは

  • 要素名に関する条件($category)
  • 要素のコンテンツに関する条件($word)

を2つのpredicate(述語)に分けることです.

以下oXygen 20.1でやってみた画面です.

oXygenでのスクリーンショット

※ なおスクリーンショットではXSLTプロセッサとしてSaxon 9.8が表示されていますが、XSLT 1.0のSaxon 6.5でも動作を確認しました.

投稿2018/07/03 00:35

編集2018/07/03 02:09
tmakita

総合スコア69

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

crossism

2018/07/05 15:02

遅くなってしまいましたが、解決できました。解説までありがとうございます! 二つの述語に分ける、というのにとても納得しました。あとはパスの理解がまだ足りなかったようなのでまた勉強したいと思います。お世話になりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問