5

私は次のxmlを持っています:

<policy>
    <games>
         <game startTime="11:00"/>
         <game startTime="11:20"/>
         <game startTime="11:40"/>
    </games>
    <games>
         <game startTime="11:10"/>
         <game startTime="11:30"/>
         <game startTime="11:50"/>
    </games>
</Policy>

各ゲームノードに新しい属性を追加し、時間順に値を追加する xslt を作成しようとしています。

<policy>
    <games>
         <game startTime="11:00" id="1"/>
         <game startTime="11:20" id="3"/>
         <game startTime="11:40" id="5"/>
    </games>
    <games>
         <game startTime="11:10" id="2"/>
         <game startTime="11:30" id="4"/>
         <game startTime="11:50" id="6"/>
    </games>
</policy>

ゲームノードを現在の順序に保つ必要があるため、xsl:sort が機能するかどうかわかりません。

現時点では、明らかに現在の順序で番号を付けているだけで、時間属性は考慮されていません。

<xsl:template match="game">
    <xsl:copy>
      <xsl:attribute name="id">
        <xsl:value-of select="count(preceding::game) + 1"/>
      </xsl:attribute>
      <xsl:apply-templates select="@*|node()"/>
    </xsl:copy>
</xsl:template>
4

2 に答える 2

2

これよりも良い方法があることを願っています:

<xsl:template match="game">
    <xsl:copy>
        <xsl:variable name="time" select="@startTime" />
        <xsl:for-each select="//game">
            <xsl:sort select="@startTime" />
            <xsl:if test="current()/@startTime = $time">
                <xsl:attribute name="id">
                    <xsl:value-of select="position()"/>
                </xsl:attribute>
            </xsl:if>
        </xsl:for-each>
        <xsl:apply-templates select="@*|node()"/>
    </xsl:copy>
</xsl:template>
于 2013-11-06T16:42:15.183 に答える
1

マッチテンプレートを

<xsl:template match="game">
  <xsl:variable name="current_time" select="number(substring-before(@startTime,':'))*60 + number(substring-after(@startTime,':'))"/>
  <xsl:copy>
    <xsl:attribute name="id">
      <xsl:value-of select="count(../../games/game[number(substring-before(@startTime,':'))*60 + number(substring-after(@startTime,':')) &lt; $current_time]) + 1"/>
    </xsl:attribute>
    <xsl:apply-templates select="@*|node()"/>
  </xsl:copy>
</xsl:template>

また、望ましい結果が得られます。このアプローチはソートを使用しませんが、各エントリについて、現在のエントリより下のすべてのエントリをカウントします。XSLT 1.0 では文字列を比較できないという驚くべき事実を今日知ったので、これは非常に興味深い作業でした。元のテンプレートの全体的な構造は維持されますが (@Rubens のソリューションと比較して)、時間文字列を数値に変換する必要があります。もちろん、これは不便です。ただし、10:00 時より前の時間に関しても堅牢にするために、おそらく他のソリューションに文字列機能を追加する必要があります。

ちなみに、タイムスタンプが複数回発生する場合、ナンバリングはギャップのあるランキングに対応します (ギャップのない密なランキングとは対照的です)。

于 2013-11-06T17:52:37.547 に答える