2012-08-07 80 views
0

XSLT-1.0中可能使用xml中的值進行排序。在下面的示例中,<examples>已要求將<example>的列表按year字段排序。XSLT按XML中命名的元素進行排序

... 
<examples> 
    <sortby>year</sortby> 

    <example> 
    <year>2012</year> 
    <number>3</number> 
    </example> 

</examples> 
... 

靜態條件使用選擇在這種情況下不能正常工作,因爲我不知道在<example>可能的領域將是什麼。

+0

可以使用[xsl:sort](http://www.w3.org/TR/xslt/#sorting) – toniedzwiedz 2012-08-07 12:02:57

回答

1

是,使用這種形式的的東西:

<xsl:apply-templates select="example"> 
    <xsl:sort select="*[name()=sortby]" data-type="{sort-data-type}" 
      order="{sort-order}" /> 
</xsl:apply-templates> 

請注意,你還需要指定排序的數據類型和順序。

完整示例

<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:template match="/*"> 
    <xsl:copy> 
    <xsl:apply-templates select="example"> 
     <xsl:sort select="*[name()=/*/sortby]" data-type="{/*/sort-data-type}" 
       order="{/*/sort-order}" /> 
    </xsl:apply-templates> 
    </xsl:copy> 
</xsl:template> 

<xsl:template match="example"> 
    <xsl:copy-of select="."/> 
</xsl:template> 
</xsl:stylesheet> 

當在下面的XML文檔被應用於這種轉變:

<examples> 
    <sortby>year</sortby> 
    <sort-data-type>number</sort-data-type> 
    <sort-order>descending</sort-order> 
    <example> 
     <year>2008</year> 
     <number>3</number> 
    </example> 
    <example> 
     <year>2012</year> 
     <number>2</number> 
    </example> 
    <example> 
     <year>2010</year> 
     <number>5</number> 
    </example> 
</examples> 

有用,正確的結果產生

<examples> 
    <example> 
     <year>2012</year> 
     <number>2</number> 
    </example> 
    <example> 
     <year>2010</year> 
     <number>5</number> 
    </example> 
    <example> 
     <year>2008</year> 
     <number>3</number> 
    </example> 
</examples> 

如果相同的變換應用於此XML文檔上(與上述相同,但具有改變sortbysort-order):

<examples> 
    <sortby>number</sortby> 
    <sort-data-type>number</sort-data-type> 
    <sort-order>ascending</sort-order> 
    <example> 
     <year>2008</year> 
     <number>3</number> 
    </example> 
    <example> 
     <year>2012</year> 
     <number>2</number> 
    </example> 
    <example> 
     <year>2010</year> 
     <number>5</number> 
    </example> 
</examples> 

然後再次有用,正確的結果產生

<examples> 
    <example> 
     <year>2012</year> 
     <number>2</number> 
    </example> 
    <example> 
     <year>2008</year> 
     <number>3</number> 
    </example> 
    <example> 
     <year>2010</year> 
     <number>5</number> 
    </example> 
</examples> 

說明

  1. xsl:sortselect屬性可以包含任何XPath表達式,因此我們可以指定一個表達式來選擇要排序的元素的任何子元素,以使其名稱是評估另一個XPath表達式的結果。

  2. 在XSLT,典型地,所有的屬性以外select允許* AVT * S(屬性值模板)以它們的值來指定。

0

排序方式*[local-name() = $your-sort-item],例如,

<xsl:template match="examples"> 
    <xsl:variable name="sort-name" select="sortby"/> 
    <xsl:apply-templates select="example"> 
    <xsl:sort select="*[local-name() = $sort-name]"/> 
    </xsl:apply-templates> 
</xsl:template> 
0

我假設你的意思是在你的排序應該是動態的節點,從examples/sortBy節點讀取。既然如此:

<xsl:template match="examples"> 
    <xsl:apply-templates select='example'> 
     <xsl:sort 
      select='*[name() = /examples/sortby]' 
      data-type='number' 
      order='descending' 
     /> 
    </xsl:apply-templates> 
</xsl:template> 
<xsl:template match='example'> 
    <p><xsl:value-of select='year' /></p> 
</xsl:template> 

this XML Playground Runnable的演示。

每年輸出一個段落。根據需要將「降序」更改爲「升序」。