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

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

新規登録して質問してみよう
ただいま回答率
85.39%
XML

XMLは仕様の1つで、マークアップ言語群を構築するために使われています。

XSLT

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

Q&A

解決済

1回答

349閲覧

xsl にて上位要素のカレントな属性値を適切に取得したい

matsuand

総合スコア186

XML

XMLは仕様の1つで、マークアップ言語群を構築するために使われています。

XSLT

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

1グッド

0クリップ

投稿2023/09/18 02:55

編集2023/09/18 03:08

xsl にて上位要素の値を適切に取得したい

当方 xsl プログラミング初心者です。

  • 下述するファイル test.xml、test.xsl を用意しました。
  • xsltproc --output test.html test.xsl test.xml の実行により test.htmlを得ようとしています。
  • test.htmlの結果イメージ(現状の実際)というのが、実際の出力結果なのですが、ここにおいて「1Granchaild ...」という表記が並びます。この冒頭の "1" は、Grandchildなる要素の上位要素ChildNum属性(のつもり)でいます。目指したいのは順次処理される中で、処理対象のChildNumが 1,2,3 と変化していくに連れて、このNum属性取得が 1, 2, 3 となっていって欲しいのですが、結果イメージのとおり 1 が取得されるだけです。
  • これを実現している箇所はtest.xsl内の<xsl:value-of select="../../Child/@Num"/>という箇所です。私の理解では、これが呼び出されるたびに @Numの値が 1,2,3 となっていくものと(勝手に)思っていたのですが、実際にはそうなりません。
  • 上の記載部分をたとえば<xsl:value-of select="//Child[current()]/@Num"/>などとしたり、と思いつくことをやってはいるのですが、なかなか所望の結果が得られません。まだ xsl を初めたばかりなので、ゼロスタートでありそもそも思いつく知識が皆無です。
  • ご助言頂けますか? 根本的な理解誤りがあればご指摘も頂戴したいと思います。
  • 下記に例示するように、出力結果イメージ(期待する出力)が得られるのであれば、全く異なる手法でも構いません。ただし apply-templates を使った呼び出し方が、いわば「オブジェクト指向ライク」なのでそれは維持したく、たとえばfor each的なことは「構造化プログラミングライク」なので、気分的にはやりたくないと思っています。

よろしくお願いいたします。

test.xml

1<?xml version="1.0" encoding="UTF-8" standalone="no"?> 2<Top> 3 <Child Num="1"> 4 <Name>Child one</Name> 5 <Grandchild> 6 <Name>Grandchild one</Name> 7 </Grandchild> 8 <Grandchild> 9 <Name>Grandchild two</Name> 10 </Grandchild> 11 </Child> 12 <Child Num="2"> 13 <Name>Child two</Name> 14 <Grandchild> 15 <Name>Grandchild one</Name> 16 </Grandchild> 17 </Child> 18 <Child Num="3"> 19 <Name>Child three</Name> 20 <Grandchild> 21 <Name>Grandchild one</Name> 22 </Grandchild> 23 <Grandchild> 24 <Name>Grandchild two</Name> 25 </Grandchild> 26 <Grandchild> 27 <Name>Grandchild three</Name> 28 </Grandchild> 29 </Child> 30</Top>

test.xsl

1<?xml version="1.0" encoding="UTF-8" ?> 2 3<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> 4 <xsl:output method="html" encoding="UTF-8"/> 5 6 <xsl:template match="/"> 7 <xsl:apply-templates/> 8 </xsl:template> 9 10 <xsl:template match="Top"> 11 <html lang="ja"> 12 <body> 13 <xsl:apply-templates select="Child"/> 14 </body> 15 </html> 16 </xsl:template> 17 18 <xsl:template match="Child"> 19 <h1><xsl:value-of select="Name"/></h1> 20 <xsl:apply-templates select="Grandchild"/> 21 </xsl:template> 22 23 <xsl:template match="Grandchild"> 24 <h2><xsl:value-of select="../../Child/@Num"/> <xsl:value-of select="Name"/></h2> 25 </xsl:template> 26 27</xsl:stylesheet>

test.htmlの出力結果イメージ(現状の実際)

1<h1>Child one</h1> 2<h2>1Grandchild one</h2> 3<h2>1Grandchild two</h2> 4 5<h1>Child two</h1> 6<h2>1Grandchild one</h2> 7 8<h1>Child three</h1> 9<h2>1Grandchild one</h2> 10<h2>1Grandchild two</h2> 11</h2>1Grandchild three</h2>

test.htmlの出力結果イメージ(期待する出力)

1<h1>Child one</h1> 2<h2>1Grandchild one</h2> 3<h2>1Grandchild two</h2> 4 5<h1>Child two</h1> 6<h2>2Grandchild one</h2> 7 8<h1>Child three</h1> 9<h2>3Grandchild one</h2> 10<h2>3Grandchild two</h2> 11<h2>3Grandchild three</h2>

※ 出力結果イメージ(現状の実際)と比べて、Grandchild の表記の前に、1,2,3 と数値が順次、Child の Num に合わせて変わっているところが違いです。

melian👍を押しています

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

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

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

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

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

guest

回答1

0

ベストアンサー

ancestor(親ノードを参照)を利用するとよいかと。

xsl

1 <xsl:template match="Grandchild"> 2 <h2><xsl:value-of select="ancestor::Child/@Num"/> <xsl:value-of select="Name"/></h2> 3 </xsl:template>

投稿2023/09/18 07:46

編集2023/09/18 07:50
melian

総合スコア20455

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

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

matsuand

2023/09/18 08:53

ancestor を初めて知りました。ご指摘により意図することが実現できました。誠にありがとうございます。 なお自身でしばらく調べ続けていて、以下の Stackoverflow のように "../@Num" と簡易にすれば実現できることも知りました。ただし ancestor を使った形式が、実は他に悩んでいる箇所がたくさんあったのですが、一気に解決しており、大変ありがたく思っております。 https://stackoverflow.com/questions/1409778/how-to-read-attribute-of-a-parent-node-from-a-child-node-in-xslt
OACleaner

2023/09/19 19:50

ancestor で得られるのは祖先かと。(親は parent)
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.39%

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

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

質問する

関連した質問