2016-02-07 4 views
1

снова сражается с XSLT 1.0. На этот раз у меня есть следующий сценарий. У меня есть некоторые данные, и для каждого у меня назначенная дата. Я могу распечатать их отсортированным, но из-за моего небольшого знания XSLT это не то, что я хочу. Я не хочу получать полный вывод из XML, я хочу получить только самое последнее или самое старое в дате.Извлечение «самой старой» даты из XML-данных в XSLT 1.0

Формат даты «dd/mm/yyyy».

Например со следующим XML:

<PICNews> 

<news> 

    <Date>31/06/2007</Date> 
    <Author>Dan Jurden</Author> 
    <Type>Memo</Type> 
    <Text>This is a memo.</Text> 
</news> 
<news> 
    <Date>21/07/2007</Date> 
    <Author>Dan Jurden</Author> 
    <Type>News</Type> 
    <Text>This is some news.</Text> 
</news> 
<news> 
    <Date>22/06/2007</Date> 
    <Author>Dan Jurden</Author> 
    <Type>Alert</Type> 
    <Text>This is an alert.</Text> 
</news> 

Я хотел бы найти такое преобразование, которое даст мне обратно 22/06/2007 и 21/07/2007.

Следующий код XSLT (только сниппета) будет печатать данные в виде упорядоченного списка, я хочу, чтобы получить только первый или последний:

<xsl:for-each select="/PICNews/news"> 
    <xsl:sort select="substring(./Date,7,10)" order="descending"/> 
    <xsl:sort select="substring(./Date,4,6)" order="descending"/> 
    <xsl:sort select="substring(./Date,1,2)" order="descending"/> 
    Date = <xsl:value-of select="./Date" /> <br/> 
</xsl:for-each> 

Я ищу решение, как:

<xsl:apply-templates select="OldestDate"/> 

, который должен предоставить мне 22/06/2007

Любое предложение?

+0

http://stackoverflow.com/help/someone-answers –

ответ

1

Я хочу, чтобы получить только первый или последний:

Чтобы получить первый (то есть самый ранний) дату, попробуйте:

<xsl:for-each select="/PICNews/news"> 
    <xsl:sort select="substring(Date,7,4)" data-type="number" order="ascending"/> 
    <xsl:sort select="substring(Date,4,2)" data-type="number" order="ascending"/> 
    <xsl:sort select="substring(Date,1,2)" data-type="number" order="ascending"/> 
    <xsl:if test="position()=1"> 
     Date = <xsl:value-of select="Date" /> <br/> 
    </xsl:if> 
</xsl:for-each> 

Чтобы получить последний (т.е. последний) дату , изменение:

<xsl:if test="position()=1"> 

к:

<xsl:if test="position()=last()"> 

P.S. Обратите внимание на разницу в звонках substring() и на сортировку data-type.

0

Внутри for-each вы можете проверить <xsl:if test="position() = 1"> соответственно position() = last(), чтобы найти первый, соответственно последний в порядке сортировки.

Смежные вопросы