1

私はプロジェクトに取り組んでおり、問題があります。私は最近、変数の値を変更できず、この問題の回避策を見つけることができないことを確認しました。コードを汎用的に作成する必要がありますが、これを正しく行うことができません。

私のXSLTコード........

                   <tracklist>
                        <xsl:for-each select = "VinylRecord/Tracks/Song">

                            <xsl:choose>

                                <xsl:when test = "@Track = 1">
                                    <xsl:element name="side{@Side}">

                                    <xsl:variable name = "d" select = "@Track"/>

                                        <xsl:for-each select = "../Song">
                                            <xsl:choose>
                                                <xsl:when test = "@Side = ../Song/following:: @Side">

                                                    <track>

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

                                                        <xsl:attribute name = "runtime">
                                                            <xsl:value-of select = "Length" />
                                                        </xsl:attribute>

                                                        <xsl:value-of select = "text()" />

                                                    </track>

                                                </xsl:when>                                               
                                            </xsl:choose>
                                        </xsl:for-each>


                                    </xsl:element>
                                </xsl:when>

                            </xsl:choose>

                        </xsl:for-each>
                    </tracklist>

XML文書…………

    <Tracks>
        <Song Side="A" Track="1">
            The Nerve
            <Length>2.58</Length>
        </Song>
        <Song Side="A" Track="2">
            Backfire
            <Length>3.22</Length>
        </Song> 
        <Song Side="A" Track="3">
            Clipping
            <Length>4.05</Length>
        </Song>
        <Song Side="A" Track="4">
            Spotlight
            <Length>3.21</Length>
        </Song>
        <Song Side="A" Track="5">
            No Response
            <Length>4.01</Length>
        </Song>
        <Song Side="A" Track="6">
            Pins and Needles
            <Length>4.05</Length>
        </Song>
        <Song Side="B" Track="1">
            Goodbye
            <Length>4.09</Length>
        </Song>
        <Song Side="B" Track="2">
            Odds
            <Length>3.01</Length>
        </Song>
        <Song Side="B" Track="3">
            Electrify
            <Length>3.49</Length>
        </Song>
        <Song Side="B" Track="4">
            Armistice
            <Length>3.54</Length>
        </Song>
        <Song Side="B" Track="5">
            Lost Year
            <Length>3.13</Length>
        </Song>
        <Song Side="B" Track="6">
            Burden
            <Length>9.06</Length>
        </Song>
    </Tracks>

...

どんなヒントでも大歓迎です

期待される結果 ...............

これは、上に表示されたプログラム全体のほんの一部ですが、結果は次のように表示されると想定されます。

        <tracklist>
            <sideA>
                <track no="1" runtime="2.58">The Nerve</track>
                <track no="2" runtime="3.22">Backfire</track>
                <track no="3" runtime="4.05">Clipping</track>
                <track no="4" runtime="3.21">Spotlight</track>
                <track no="5" runtime="4.01">No Response</track>
                <track no="6" runtime="4.05">Pins and Needles</track>
            </sideA>
            <sideB>
                <track no="1" runtime="4.09">Goodbye</track>
                <track no="2" runtime="3.01">Odds</track>
                <track no="3" runtime="3.49">Electrify</track>
                <track no="4" runtime="3.54">Armistice</track>
                <track no="5" runtime="3.13">Lost Year</track>
                <track no="6" runtime="9.06">Burden</track>
            </sideB>
        </tracklist>
4

3 に答える 3

0

このXSLTソリューションは非常に単純です

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>
 <xsl:strip-space elements="*"/>

 <xsl:key name="kFollowing" match="Song"
  use="generate-id(preceding-sibling::Song[not(@Side = current()/@Side)][1])"/>

 <xsl:template match="node()|@*">
     <xsl:copy>
       <xsl:apply-templates select="node()|@*"/>
     </xsl:copy>
 </xsl:template>

 <xsl:template match="/*">
  <tracklist>
   <xsl:apply-templates/>
  </tracklist>
 </xsl:template>

 <xsl:template match="Song"/>

 <xsl:template match=
  "Song[not(@Side = preceding-sibling::Song[1]/@Side)]">

  <xsl:element name="side{@Side}">
   <xsl:apply-templates mode="inGroup" select=
   "key('kFollowing', generate-id(preceding-sibling::Song[1]/@side))"/>
  </xsl:element>
 </xsl:template>

 <xsl:template match="Song" mode="inGroup">
  <track no="{@Track}" runtime="{Length}"><xsl:value-of select="text()"/></track>
 </xsl:template>
 <xsl:template match="text()"/>
</xsl:stylesheet>

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

<Tracks>
    <Song Side="A" Track="1">
            The Nerve
        <Length>2.58</Length>
    </Song>
    <Song Side="A" Track="2">
            Backfire
        <Length>3.22</Length>
    </Song>
    <Song Side="A" Track="3">
            Clipping
        <Length>4.05</Length>
    </Song>
    <Song Side="A" Track="4">
            Spotlight
        <Length>3.21</Length>
    </Song>
    <Song Side="A" Track="5">
            No Response
        <Length>4.01</Length>
    </Song>
    <Song Side="A" Track="6">
            Pins and Needles
        <Length>4.05</Length>
    </Song>
    <Song Side="B" Track="1">
            Goodbye
        <Length>4.09</Length>
    </Song>
    <Song Side="B" Track="2">
            Odds
        <Length>3.01</Length>
    </Song>
    <Song Side="B" Track="3">
            Electrify
        <Length>3.49</Length>
    </Song>
    <Song Side="B" Track="4">
            Armistice
        <Length>3.54</Length>
    </Song>
    <Song Side="B" Track="5">
            Lost Year
        <Length>3.13</Length>
    </Song>
    <Song Side="B" Track="6">
            Burden
        <Length>9.06</Length>
    </Song>
</Tracks>

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

<tracklist>
   <sideA>
      <track no="1" runtime="2.58">
            The Nerve
        </track>
      <track no="2" runtime="3.22">
            Backfire
        </track>
      <track no="3" runtime="4.05">
            Clipping
        </track>
      <track no="4" runtime="3.21">
            Spotlight
        </track>
      <track no="5" runtime="4.01">
            No Response
        </track>
      <track no="6" runtime="4.05">
            Pins and Needles
        </track>
   </sideA>
   <sideB>
      <track no="1" runtime="2.58">
            The Nerve
        </track>
      <track no="2" runtime="3.22">
            Backfire
        </track>
      <track no="3" runtime="4.05">
            Clipping
        </track>
      <track no="4" runtime="3.21">
            Spotlight
        </track>
      <track no="5" runtime="4.01">
            No Response
        </track>
      <track no="6" runtime="4.05">
            Pins and Needles
        </track>
   </sideB>
</tracklist>
于 2012-05-14T13:42:52.897 に答える
0

これは、標準的なグループ化の問題のように見えます。

XSLT 2.0 を使用している場合は、

<xsl:for-each-group select="Song" group-by="Side">
  <xsl:element name="Side{current-grouping-key)}">
    <xsl:for-each select="current-group()">
      <track no="{position()}" runtime="{Length}">
         <xsl:value-of select="."/>
      </track>
    </xsl:for-each>
  </xsl:element>
</xsl:for-each-group>

XSLT 1.0 ではかなり難しくなりますが、それでも教科書的な問題です。答えについては、「Muenchian Grouping」を調べてください。

于 2012-05-14T13:14:49.897 に答える
0

「これはバグではなく、機能です」: XSLT 変数は、変更できないように設計されています。実際、それらは定数と名付けることができます。これを回避するのは困難ですが、パラメーターを使用して行うことができます。ほとんどの場合、プログラムがテンプレートを介してデータによって駆動される XSLT プログラミングの試行を使用する場合、これは必要ありません。「for-each」のようなものは、XSLT の考え方に実際には適合しない手続き的な方法です。その結果、何を得たいですか?

期待される結果がわかると、silesheet は次のようになります。

<xsl:template match="Tracks">
 <tracklist>
  <sideA>
   <xsl:apply-templates select="Song[@Side='A']"/>
  </sideA>
  <sideB>
   <xsl:apply-templates select="Song[@Side='B']"/>
  </sideB>
 </tracklist>
</xsl:template>
<xsl:template match="Song">
 <track no="{@Track}" runtime="{Length}">
  <xsl:value-of select="text()"/>
 </track>
</xsl:template>
于 2012-05-14T06:51:38.567 に答える