XSLTのfor-each-groupのスタート条件(group-starting-with)についてご教授ください。
for-each-groupを使用して、階層を付けた2つのtopicを生成したいと思います。
下記のサンプルソース(A)を変換テーブル(A)で変換して、アウトプット(A)を取得しました。
試したこと
サンプルソース(A):
<topic id=""> <title>Guitar maker</title> <body> <p outputclass="title1">Imported guitar</p> <p outputclass="body">Martin</p> <p outputclass="body">Gibson</p> <p outputclass="title1">Japanese guitar</p> <p outputclass="body">Yamaha</p> <p outputclass="body">Morris</p> </body> </topic>
XSLT(A):
<xsl:template match="title"> <map> <xsl:value-of select="."/> </map> </xsl:template> <xsl:template match="body"> <xsl:for-each-group select="p" group-starting-with="p[@outputclass='title1']"> <topic> <xsl:choose> <xsl:when test="current-group()[self::p[@outputclass='title1']]"> <title> <xsl:value-of select="."/> </title> <body> <xsl:apply-templates select="current-group()"/> </body> </xsl:when> </xsl:choose> </topic> </xsl:for-each-group> </xsl:template> <xsl:template match="node()"> <xsl:choose> <xsl:when test="@outputclass!='title1'"> <p><xsl:value-of select="."/></p> </xsl:when> </xsl:choose> </xsl:template>
アウトプット(A):
<map>Guitar maker</map> <topic> <title>Imported guitar</title> <body> <p>Martin</p> <p>Gibson</p> </body> </topic> <topic> <title>Japanese guitar</title> <body> <p>Yamaha</p> <p>Morris</p> </body> </topic>
不具合の内容
ここまでは良かったのですが、ソースが以下のような場合(B)、グループのスタート条件を変更しても、同様の結果が得られません。
サンプルソース(B)
<topic id=""> <title>Guitar maker</title> <body> <para> <prop outputclass="title1"/> <p>Imported guitar</p> </para> <para> <prop outputclass="body"/> <p>Martin</p> </para> <para> <prop outputclass="body"/> <p>Gibson</p> </para> <para> <prop outputclass="title1"/> <p>Japanese guitar</p> </para> <para> <prop outputclass="body"/> <p>Yamaha</p> </para> <para> <prop outputclass="body"/> <p>Morris</p> </para> </body> </topic>
XSLT(B):
<xsl:template match="body"> <xsl:for-each-group select="para" group-starting-with="para/prop[@outputclass='title1']"> <topic> <xsl:choose> <xsl:when test="current-group()[self::para/prop[@outputclass='title1']]"> <title> <xsl:value-of select="./p"/> </title> <body> <xsl:apply-templates select="current-group()/p"/> </body> </xsl:when> </xsl:choose> </topic> </xsl:for-each-group> </xsl:template> <xsl:template match="p"> <xsl:choose> <xsl:when test="../prop/@outputclass!='title1'"> <p><xsl:value-of select="."/></p> </xsl:when> </xsl:choose> </xsl:template>
残念なアウトプット(B):
<map>Guitar maker</map> <topic> <title>Imported guitar</title> <body> <p>Martin</p> <p>Gibson</p> <p>Yamaha</p> <p>Morris</p> </body> </topic>
ネットで公開されていたサンプルを見様見真似で流用しています。
思い通りのグループ化がされていないようなので、「<xsl:for-each-group select="para" group-starting-with="para/prop[@outputclass='title1']">」のスタート指定がNGなのでしょうか。
サンプルソース(B)から、アウトプット(A)の結果が得られるように、XSLT(B)のダメな部分をご指摘ください。
そもそも、「for-each-group」では無理な変換であれば、別途の方法をご教授ください。
よろしくお願いいたします。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/04/08 09:55