0

Imagine the following 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>

I use the following xslt to select a list of unique IDs into a variable

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

Then i let xslt build some html for each ID (the output will be a horizontal list of elements per 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>

The problem is: how can i sort the elements in the first level of the for-each nesting (the IDs) without having the Element by which i want to sort in the list itself (the ID list).

In practical terms: how can i sort by Jedi hierarchy (master -> pupil), if elementSort 1 means master and elementSort 2 means pupil, having multiple elements per hierarchy in each row, which are then ordered by modifyDate.

4

2 回答 2

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 回答
0

我找到了一个解决方案,尽管它可能不是很好的“xslt-design”。

我将唯一 elementSorts 的列表存储在一个附加变量中,并在原始第一个变量周围放置另一个 for-each。然后我结合条件(唯一性和 sortID),同时设置保存唯一元素 ID 的变量。

<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)]" />

另一个注意事项

如果 xml 文档中有其他节点可以包含 elementID 节点,则您必须按如下方式指定以下:: 子句以避免不必要的行为:

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

这样,在评估唯一性时仅考虑元素节点内部的 elementID,如果存在通过 elementID 与元素节点相关的节点,则会派上用场。

于 2012-05-31T07:54:17.803 回答