xsl にて上位要素の値を適切に取得したい
当方 xsl プログラミング初心者です。
- 下述するファイル test.xml、test.xsl を用意しました。
xsltproc --output test.html test.xsl test.xml
の実行によりtest.html
を得ようとしています。test.html
の結果イメージ(現状の実際)というのが、実際の出力結果なのですが、ここにおいて「1Granchaild ...」という表記が並びます。この冒頭の "1" は、Grandchild
なる要素の上位要素Child
のNum
属性(のつもり)でいます。目指したいのは順次処理される中で、処理対象のChild
のNum
が 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 に合わせて変わっているところが違いです。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2023/09/18 08:53
2023/09/19 19:50