XSLT:是否可以在变量中选择唯一的ID,而不是ID本身?

XSLT:是否可以在变量中选择唯一的ID,而不是ID本身?,xslt,Xslt,想象一下下面的xml <elements> <element> <elementID>0x1000</elementID> <elementSort>1</elementSort> <elementName>Master Joda</elementName> <modifyDate>1979-01-01</modifyDate> <

想象一下下面的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>

0x1000
1.
乔达大师
1979-01-01
0x1000
1.
尤达大师
1979-01-05
0x2000
2.
卢克·天行者
1979-01-08
我使用以下xslt将唯一ID列表选择到变量中

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

然后我让xslt为每个ID构建一些html(输出将是每个ID元素的水平列表)


问题是:如何在列表本身(ID列表)中没有要排序的元素的情况下,对每个嵌套(ID)的第一级中的元素进行排序


在实践中:如果elementSort 1表示master,elementSort 2表示瞳孔,那么我如何按绝地等级(master->Pullow)排序,每行每个等级有多个元素,然后按modifyDate排序。

而不是

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

我已经找到了一个解决方案,尽管它可能不是很好的“xslt设计”

我将惟一元素排序的列表存储在一个附加变量中,并在原始的第一个变量周围为每个元素放置另一个。然后,在设置保存唯一元素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)]" />

另一个音符

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

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


这样,在评估唯一性时只考虑元素节点内部的elementID,如果存在通过elementID与元素节点相关的节点,则此方法非常有用。

这是非常不清楚的--在多次阅读此问题时,答案是:为什么不添加
?因为我首先让ID列表是唯一的。for each的第一级只是在唯一的ID上迭代,但此时我没有elementSort。请看我的答案如何做到这一点。@Dimitre抱歉,我在for each的内部有一个输入错误,现在看起来应该是这样,但这仍然不能解决问题,我的解决方案仍然必须生成所需的输出。我想实现的是克服XML结构的“糟糕”设计。基本上,XML应该反映我想要实现的目标,但目前这是不可能的。所以我想通过XSLT手段“规范化”XML数据
<xsl:variable name="ids" 
   select="elements/element[elementSort=$sort]/elementID[not(.=following::element/elementID)]" />