1

現在、私のファイルには多くの「xsl:choose」条件があり、1 つの文字に対して 1 つの「xsl:choose」があり、うまく機能します。多くの「xsl:choose」を「for-each」ループに置き換えることで、この状況を単純化しようとしましたが、うまくいきませんでした。

「for-each」内の count() は常に 0 を返すように思えます。「for-each」を使用しない同じ count() が正常に機能するため、興味があります。

助けてください。

<?xml version="1.0"?>
<stocks>
<names date="10/30/2013" time="20:37:12">
    <name>WGOS1</name>
    <name>WGOS2</name>
    <name>WGOS3</name>
    <name>WGOS4</name>
    <name>WGOS5</name>
</names>
<loc>
    <slot>P</slot>
    <slot>P</slot>
    <slot>P</slot>
    <slot>P</slot>
    <slot>H</slot>
    <slot>S</slot>
</loc>
<loc>
    <slot>P</slot>
    <slot>P</slot>
    <slot>P</slot>
    <slot>S</slot>

「count」関数を使用して値をカウントする場合。「loc」ノードの「B」、正常に動作します

<xsl:variable name="color-table">
    <var code="A">pink</var  >
    <var code="B">silver</var>
    <var code="P">red</var>
    <var code="D">pink</var>
    <var code="H">yellow</var>
    <var code="S">lightblue</var>
    <var code="T">green</var>
    <var code="W">pink</var>
</xsl:variable>

<xsl:template match="/">    

<xsl:choose>
    <xsl:when test="count(/stocks/loc[$pos]/slot [. eq 'B']) &gt; 0">
        <td class="slot-B">
            <xsl:value-of select="count(/stocks/loc[$pos]/slot [. eq 'B'])"/>
            <xsl:text>B</xsl:text>
        </td>
    </xsl:when>
    </xsl:choose>

しかし、for-each ループ内で同じことをしようとすると、count() の結果が常に 0 であるため、テスト条件が失敗します。

    <xsl:for-each select="$color-table/var">
    <xsl:variable name="p" select="@code"/>
    <xsl:choose>
        <xsl:when test="count(/stocks/loc[$pos]/slot [. eq $p]) &gt; 0">
            <td class="slot-$p">
                <xsl:value-of select="count(/stocks/loc[$pos]/slot [. eq $p])"/>
                <xsl:value-of select="$p"/>
            </td>
        </xsl:when>
    </xsl:choose>
    </xsl:for-each>
4

1 に答える 1

1

変数は$color-table一時ツリーを参照するため、

<xsl:for-each select="$color-table/var">

/元のドキュメントのルートではなく、その一時ツリーのルートである/stocks/loc[$pos]/slotため、ノードは見つかりません。

/に入る前に、アウターを別の変数に格納する必要がありますfor-each

<xsl:variable name="slash" select="/" />
<xsl:for-each select="$color-table/var">
<xsl:variable name="p" select="@code"/>
<xsl:choose>
    <xsl:when test="count($slash/stocks/loc[$pos]/slot [. eq $p]) &gt; 0">
        <td class="slot-{$p}">
            <xsl:value-of select="count($slash/stocks/loc[$pos]/slot [. eq $p])"/>
            <xsl:value-of select="$p"/>
        </td>
    </xsl:when>
</xsl:choose>
</xsl:for-each>

for-each-groupただし、カラーテーブルを反復するよりも、スロット自体を反復する方が効率的かもしれません

<xsl:for-each-group select="/stocks/loc[$pos]/slot" group-by=".">
  <td class="slot-{current-grouping-key()}">
    <xsl:value-of select="count(current-group())" />
    <xsl:value-of select="current-grouping-key()" />
  </td>
</xsl:for-each-group>
于 2013-11-01T14:30:40.353 に答える