none
XSLT での変換について RRS feed

  • 質問

  • お世話になってます。

    XML (XHTML) 形式のデータ加工で、以下のように <table> の要素を <ol> 形式に変換したいのですが、XSLT だけで 変換可能でしょうか?

    例:
    <table>
    <tr><td>A</td><td>1</td><td>value 1</td></tr>
    <tr><td></td><td>2</td><td>value 2</td></tr>
    <tr><td>B</td><td>1</td><td>value 3</td</tr>
    <tr><td></td><td>2</td><td>value 4</td></tr>
    <tr><td></td><td>3</td><td>value 5</td></tr>
    </table>

    変換後↓

    A
    <ol>
    <li>value 1</li>
    <li>value 2</li>
    </ol>
    B
    <ol>
    <li>value 3</li>
    <li>value 4</li>
    <li>value 5</li>
    </ol>

    左列の 値が入っているセルを見出しに、それ以降 右列のセルを リスト項目として並べたいのですが、テンプレートで「見出しの後に <ol> 開始タグだけ出力…」というような事ができず、困っています。
    XSLT だと、こういう変換はできないんでしょうか…?
    (XDocument だと 汎用が利かないので、できれば XSLT だけで変換したいんですが;)

    ご存知の方いらっしゃらないでしょうか。



    2015年4月27日 8:49

回答

  • こんにちは。

    スパゲティコードですが恥を忍んで投稿します。
    XSLT関数に詳しくないので無理やり感があるかもしれません。申し訳ありません。

    <?xml version="1.0" encoding="utf-8"?>
    <xsl:stylesheet version="1.0"
                    xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
      <xsl:output indent="yes" encoding="utf-8"/>
      <xsl:template match="table">
        <xsl:for-each select="tr">
          <xsl:if test="td[1] != ''">
            <xsl:value-of select="td[1]"/>
            <ol>
              <xsl:call-template name="liLoop">
                <xsl:with-param name="index" select="position()" />
              </xsl:call-template>
            </ol>
          </xsl:if>
        </xsl:for-each>
      </xsl:template>
      
      <xsl:template name="liLoop">
        <xsl:param name="index" />
        <li>
          <xsl:value-of select="/table/tr[$index]/td[3]"/>
        </li>
        <xsl:if test="count(/table/tr) != $index">
          <xsl:if test="/table/tr[$index+1]/td[1] = ''">
            <xsl:call-template name="liLoop">
              <xsl:with-param name="index" select="$index+1" />
            </xsl:call-template>
          </xsl:if>
        </xsl:if>
      </xsl:template>
    
    </xsl:stylesheet>
    

    • 回答の候補に設定 星 睦美 2015年5月7日 2:32
    • 回答としてマーク 星 睦美 2015年5月11日 5:00
    2015年4月27日 10:19
    モデレータ