0

次のxmlを想像してください

<elements>
  <element>
    <elementID>0x1000</elementID>
    <elementSort>1</elementSort>
    <elementName>Master Joda</elementName>
    <modifyDate>1979-01-01</modifyDate>
  </element>
  <element>
    <elementID>0x1000</elementID>
    <elementSort>1</elementSort>
    <elementName>Master Yoda</elementName>
    <modifyDate>1979-01-05</modifyDate>
  </element>
  <element>
    <elementID>0x2000</elementID>
    <elementSort>2</elementSort>
    <elementName>Luke Skywalker</elementName>
    <modifyDate>1979-01-08</modifyDate>
  </element>
</elements>

次の xslt を使用して、一意の ID のリストを変数に選択します

<xsl:variable name="ids" 
   select="elements/element/elementID[not(.=following::elementID)]" />

次に、xslt に各 ID の HTML を作成させます (出力は、ID ごとの要素の水平方向のリストになります)。

<xsl:for-each select="$ids">

  <xsl:variable name="elementID" select="." />

  <div class="itemContainer clear" style="width:{$containerWidth}">

    <xsl:for-each select="/elements/element[elementID=$elementID]">

      <xsl:sort select="modifyDate" />

      <xsl:call-template name="elementTemplate" />

    </xsl:for-each>

  </div>

</xsl:for-each>

問題は、リスト自体 (ID リスト) で並べ替えたい要素を持たずに、for-each ネスト (ID) の最初のレベルで要素を並べ替えるにはどうすればよいかということです。

実際には、elementSort 1 がマスターを意味し、elementSort 2 が生徒を意味し、各行に階層ごとに複数の要素があり、modifyDate によって並べ替えられる場合、Jedi 階層 (マスター -> 生徒) で並べ替えるにはどうすればよいですか。

4

2 に答える 2

0

おそらくあまり良くない「xslt-design」ですが、解決策を見つけました。

一意の elementSorts のリストを追加の変数に格納し、元の最初の変数の周りに別の for-each を配置します。次に、一意の要素 ID を保持する変数を設定しながら、条件 (一意性と sortID) を組み合わせます。

<xsl:variable name="ids" 
   select="elements/element/elementID[not(.=following::elementID) and ../elementSort=$sort]" />

編集:

おそらくさらに良い:

<xsl:variable name="ids" 
   select="elements/element[elementSort=$sort]/elementID[not(.=following::elementID)]" />

別のメモ

elementID ノードを含むことができる xml ドキュメントに他のノードがある場合は、不要な動作を避けるために、次のように次の:: 句を指定する必要があります。

<xsl:variable name="ids" 
   select="elements/element[elementSort=$sort]/elementID[not(.=following::element/elementID)]" />

こうすることで、要素ノード内の elementID のみが一意性を評価するために考慮されます。elementID によって要素ノードに関連するノードがある場合に便利です。

于 2012-05-31T07:54:17.803 に答える
0

の代わりに:

<xsl:for-each select="/elements/element/elementID[elementID=$elementID]">        
  <xsl:sort select="modifyDate" />        
  <xsl:call-template name="elementTemplate" />      
</xsl:for-each> 

ところで、elementID要素には子がまったくないため、上記は明らかに正しくありませんelementID

使用:

<xsl:for-each select="/elements/element[elementID=$elementID]">        
  <xsl:sort select="elementSort" data-type="number" />        
  <xsl:sort select="modifyDate" />        
  <xsl:call-template name="elementTemplate" />      
</xsl:for-each> 
于 2012-05-30T14:25:40.933 に答える