2011-01-31 25 views
8

Đây là XML của tôi.Cách sắp xếp giá trị thông qua 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> 

Lý do là: Các nút phần tử phải được xếp hạng theo ngày và nút của nút. Thứ tự đầu tiên phải được dựa trên val và trong chuỗi này của các nút với giá trị val. Họ nên được liệt kê theo ngày.

Có ai biết cách lấy danh sách các nút XML được sắp xếp thông qua XPath không?

Bất kỳ ý tưởng nào?

+0

Dường như XPath tự nó không hỗ trợ sắp xếp: https : //stackoverflow.com/questions/8480673/sort-with-xpath-not-xsl Không chắc liệu điều này có đúng cho các phiên bản mới nhất của XPath hay không. –

Trả lời

9

Bạn có thể sử dụng xsl:sort để sắp xếp các nút phù hợp. Điều này sẽ cho phép bạn sắp xếp theo phần tử val của bạn. Tuy nhiên, XPath 1.0 không có kiểu dữ liệu ngày tháng. Một giải pháp hợp lý cho problemm này là chia ngày của bạn thành các thành phần năm, tháng và ngày của nó và sắp xếp theo từng cá nhân. Sau đây nên làm như lừa:

<?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

Cảm ơn - câu trả lời đã xóa của bạn cũng có vẻ tốt với tôi. Hàm translate() hơi phức tạp một chút ;-) – ColinE

+0

Nó không hoạt động do số đó lớn bằng số ngày :) Tôi bắt đầu viết chuỗi con, nhưng bạn đã làm. – Flack

+7

Nếu bạn chịu trách nhiệm về thiết kế XML (hoặc thậm chí nếu bạn không ...) luôn giữ ngày tháng ở định dạng ISO YYYY-MM-DD hơn là dd/mm/yyyy hoặc mm/dd/yyyy . Nó tránh sự mơ hồ cho người đọc của con người, và nó dễ dàng hơn cho phần mềm để xử lý. –

0

Dường như XPath 3.1 Mời sắp xếp:

Signatures

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

Các vấn đề liên quan