Как сортировать значения через XPath
Это мой XML.
<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>
логика такая: Узлы элементов должны быть ранжированы в соответствии с узлом val и датой. Первый порядок должен быть основан на val и в этой последовательности узлов со значением val. Они должны быть перечислены по дате.
кто-нибудь знает, как получить отсортированный список узлов XML через XPath?
какие идеи?
2 ответов
можно использовать 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>
Кажется, что 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()*