1

現在、次のようなxmlドキュメントがあります。

<site>
  <body>
    <group name="content">
      <Categories>
        <item id="1" name="cat1">
          <Children>
            <item id="2" name="cat2">
              <Children>
                <item id="3" name="cat3">
                  <Children>
                    <item id="4" name="cat4" />
                  </Children>
                </item>
                <item id="5" name="cat5">
                  <Children>
                    <item id="6" name="cat6" />
                    <item id="7" name="cat7" />
                    <item id="8" name="cat8" />
                  </Children>
                </item>
                <item id="9" name="cat9" />
                <item id="10" name="cat10" />
              </Children>
            </item>
          </Children>
        </item>
      </Categories>
    </group>
  </body>
</site>

ユーザーが id=3 のカテゴリを選択した場合:

[私のxslスタイルシートで]ルートのCategories要素から選択した要素までのすべての子孫を選択し、それらを反復するにはどうすればよいですか? たぶん次のようなもの:

<xsl:for-each select="//Categories//*[@id=3 and ancestor::Categories[1]]"> . .   ?

私に任せてください:

<xsl:value-of select="@name" /> >

その結果:

cat1 > cat2 > cat3 >

さらに説明が必要な場合はお知らせください。

どうもありがとう。

4

1 に答える 1

0

この変換:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output method="text"/>
 <xsl:strip-space elements="*"/>

 <xsl:template match="item[@id=3]">
  <xsl:apply-templates mode="ancestors"
    select="ancestor-or-self::item"/>
 </xsl:template>

 <xsl:template match="item" mode="ancestors">
  <xsl:if test="not(position()=1)"> > </xsl:if>
  <xsl:value-of select="@name"/>
 </xsl:template>
</xsl:stylesheet>

提供された XML ドキュメントに適用した場合:

<site>
  <body>
    <group name="content">
      <Categories>
        <item id="1" name="cat1">
          <Children>
            <item id="2" name="cat2">
              <Children>
                <item id="3" name="cat3">
                  <Children>
                    <item id="4" name="cat4" />
                  </Children>
                </item>
                <item id="5" name="cat5">
                  <Children>
                    <item id="6" name="cat6" />
                    <item id="7" name="cat7" />
                    <item id="8" name="cat8" />
                  </Children>
                </item>
                <item id="9" name="cat9" />
                <item id="10" name="cat10" />
              </Children>
            </item>
          </Children>
        </item>
      </Categories>
    </group>
  </body>
</site>

必要な正しい結果が生成されます。

cat1 > cat2 > cat3

更新

コメントで、OP は次のように尋ねます。

動的に値 'id'match="item[@id=3]". .設定 する方法<xsl:template match="item[@id=3]"> . .<xsl:template match="item[@id=$param]">

$pId必要な値を含むグローバル パラメータがあるとします。

XSLT 2.0 では、以下を変更するだけxsl:templateです。

 <xsl:template match="item[@id=3]">

:

 <xsl:template match="item[@id=$pId]">

XSLT 1.0 では、一致パターン内に変数/パラメーター参照を含めることは許可されていません。以下は、新しい要件をカバーする XSLT 1.0 ソリューションです。

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output method="text"/>
 <xsl:strip-space elements="*"/>

 <xsl:param name="pId" select="3"/>

 <xsl:template match="item">
  <xsl:apply-templates mode="ancestors"
    select="self::*[@id=$pId]/ancestor-or-self::item"/>
  <xsl:apply-templates select="node()[not(current()/@id = $pId)]"/>
 </xsl:template>

 <xsl:template match="item" mode="ancestors">
  <xsl:if test="not(position()=1)"> > </xsl:if>
  <xsl:value-of select="@name"/>
 </xsl:template>
</xsl:stylesheet>
于 2013-01-27T02:36:57.750 に答える