2011-01-31 143 views
8

這些是我的XML。如何通過XPath對值進行排序

<root> 

<element> 
<title>Title .. </title> 
<val>2</val> 
<date>21/01/2011</date> 
</element> 

<element> 
<title>Title .. </title> 
<val>1</val> 
<date>21/01/2011</date> 
</element> 

<element> 
<title>Title .. </title> 
<val>2</val> 
<date>22/01/2011</date> 
</element> 

</root> 

的邏輯是這樣的: Element節點應根據節點VAL和日期進行排序。 First Order必須基於val並且在具有val值的節點序列中。他們應該按日期列出。

有誰知道如何通過XPath獲得XML節點的排序列表?

任何想法?

+0

似乎XPath的本身不支持排序:HTTPS ://stackoverflow.com/questions/8480673/sort-with-xpath-not-xsl不確定這是否適用於最新版本的XPath。 – 2018-01-20 21:52:58

回答

9

您可以使用xsl:sort對匹配節點進行排序。這將允許您根據您的val元素進行排序。但是,XPath 1.0沒有日期數據類型。這個問題的一個合理的解決方案是將你的日期分成年,月和日的組成部分,並分別按每個組分排序。下面應該做的伎倆:

<?xml version="1.0" encoding="utf-8"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output method="xml" indent="yes"/> 

    <xsl:template match="root"> 
    <xsl:copy> 
     <xsl:apply-templates> 
     <xsl:sort select="val" data-type="number" order="descending"/> 

     <!-- year sort --> 
     <xsl:sort select="substring(date,7,4)" data-type="number" /> 
     <!-- month sort --> 
     <xsl:sort select="substring(date,4,2)" data-type="number" /> 
     <!-- day sort --> 
     <xsl:sort select="substring(date,1,2)" data-type="number" />   
     </xsl:apply-templates> 
    </xsl:copy> 
    </xsl:template> 

    <xsl:template match="@* | node()"> 
    <xsl:copy> 
     <xsl:apply-templates select="@* | node()"/> 
    </xsl:copy> 
    </xsl:template> 
</xsl:stylesheet> 
+0

謝謝 - 您刪除的答案對我來說也很好。 translate()函數有點狡猾;-) – ColinE 2011-01-31 08:41:53

0

看來的XPath 3.1報價排序:

簽名

fn:sort($input as item()*) as item()* 
fn:sort($input as item()*, 
    $collation as xs:string?) as item()* 
fn:sort($input as item()*, 
    $collation as xs:string?, 
    $key as function(item()) as xs:anyAtomicType*) as item()* 

https://www.w3.org/TR/xpath-functions-31/#func-sort

相關問題