2017-10-17 90 views
1

在下面的MWE中,我有一系列屬性,我將它們排序,然後輸出XML和屬性。當我輸出它看起來排序的整個XML:XSL執行排序不處理屬性?

<data attr="attrA">testA</data><data attr="attrZ">testZ</data> 
<data attr="attrZ">testZ</data><data attr="attrA">testA</data> 

但是如果我打印旁邊的屬性,我沒有得到有序輸出(升序==降序):

attrZ attrA 
attrZ attrA 

這是怎麼回事可能?我如何得到:

attrA attrZ 
attrZ attrA 

?? ??

<xsl:stylesheet version="2.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:xs="http://www.w3.org/2001/XMLSchema">  
    <xsl:variable name="dataUnsorted" as="element()*"> 
      <data attr="attrZ">testZ</data> 
      <data attr="attrA">testA</data> 
    </xsl:variable> 

    <xsl:variable name="dataAscending" as="element()*"> 
     <xsl:perform-sort select="$dataUnsorted"> 
     <xsl:sort select="@attr" order="ascending"/> 
     </xsl:perform-sort> 
    </xsl:variable> 

    <xsl:variable name="dataDescending" as="element()*"> 
     <xsl:perform-sort select="$dataUnsorted"> 
     <xsl:sort select="@attr" order="descending"/> 
     </xsl:perform-sort> 
    </xsl:variable> 

    <xsl:template match="/"> 
      <xsl:message> 
      <xsl:copy-of select="$dataAscending"/> 
     </xsl:message> 
     <xsl:message> 
      <xsl:copy-of select="$dataDescending"/> 
     </xsl:message> 
     <xsl:message> 
      <xsl:value-of select="$dataAscending/@attr"/> 
     </xsl:message> 
     <xsl:message> 
      <xsl:value-of select="$dataDescending/@attr"/> 
     </xsl:message> 
     </xsl:template>  
</xsl:stylesheet> 

回答

1

步驟/@attr$dataAscending/@attr選擇屬性節點和按文檔順序對它們進行分類,也就是如何選擇節點的工序被定義(https://www.w3.org/TR/xpath-31/#id-path-operator)。

如果你想保留的順序,你有三種選擇:

  1. 使用for in return表達:for $e in $dataAscending return $e/@attr
  2. 排序,而是存儲元素序列
  3. 的XPath/XSLT的屬性序列3+僅:使用![email protected]