2

以下に、私の xml がどのように見えるかを単純化した XML の例を作成しました。監視したい番号を含む属性があります。それは一種のカウンターであり、変換中にカウンター++のたびに何かを追加したいと思います.

問題は、xml ファイルのレベル数です。ここでは 3 つしか作成していませんが、実際には 8 つまたはそれ以上の数を作成しています。現在のノードを前のノード (またはその逆) と比較する方法を見つける必要がありますが、レベルを考慮に入れる必要があります。たとえば、以下の例では、id 属性が発生しているかどうかを確認するために、id が 4 の lvl2 ノードを id 3 の lvl3 ノードと比較する必要があります。

xml:

<lvl1 id="1">
    <lvl2 id="1">
        <lvl3 id="1"></lvl3>
        <lvl3 id ="2"></lvl3>
    </lvl2>
    <lvl2 id="2">
        <lvl3 id="3"></lvl3>                        
    </lvl2>
    <lvl2 id="4"></lvl2>
</lvl1>

グローバルカウンター変数は xslt では問題外であるため、現在のところアイデアがなく、ここでも他の場所でも見つけることができないようです..

出力は次のようになります。

  <ul>
<div>id 1</div>
<li>
  <ul>
    <li>
      <ul>
        <li></li>
        <div>id 2</div>
        <li></li>
      </ul>
    </li>
    <li>
      <ul>
        <div>id 3</div>
        <li></li>
      </ul>
    </li>
    <div>id 4</div>
    <li></li>
  </ul>
</li>

ここでは、xml を html 出力に変換するスタイルシートですが、div はありません。

<?xml version="1.0" encoding="UTF-8"?><xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:template match="/">
    <ul>
            <xsl:value-of select="@id"/>
            <xsl:apply-templates select="lvl1"/>
    </ul>
</xsl:template>
<xsl:template match="lvl1">
    <li class="{@id}">
        lvl 1
        <ul>
            <xsl:apply-templates select="lvl2"/>
        </ul>
    </li>
</xsl:template>
<xsl:template match="lvl2">
    <li class="{@id}">lvl 2
        <ul>
            <xsl:apply-templates select="lvl3"/>
        </ul>
    </li>
</xsl:template>
<xsl:template match="lvl3">
    <li class="{@id}">lvl 3
    </li>
</xsl:template>

4

2 に答える 2

0

この XSLT を適用すると

    <?xml version="1.0" encoding="UTF-8"?>
    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="html" />

    <xsl:template match='/'>
        <ul>
            <xsl:apply-templates select='*' />
        </ul>
    </xsl:template>

    <xsl:template match="*">
        <li>
        <div>
            <xsl:value-of select='@id' />
            <xsl:if test='count(*)&gt;0'>
                <ul>
                    <xsl:apply-templates select='*' />
                </ul>
            </xsl:if>
        </div>
        </li>
    </xsl:template>

    </xsl:stylesheet>

あなたが求めるものかもしれない何かを得る:

    <ul>
      <li>
        <div>1<ul>
            <li>
              <div>1<ul>
                  <li>
                    <div>1</div>
                  </li>
                  <li>
                    <div>2</div>
                  </li>
                </ul>
              </div>
            </li>
            <li>
              <div>2<ul>
                  <li>
                    <div>3</div>
                  </li>
                </ul>
              </div>
            </li>
            <li>
              <div>4</div>
            </li>
          </ul>
        </div>
      </li>
    </ul>
于 2012-08-14T11:39:33.910 に答える