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

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 に合わせて変わっているところが違いです。

コメントを投稿

0 コメント