2016-04-16 7 views
1

У меня есть структура ниже XML, и я хочу сортировать даты и обновлять один узел даты до последней даты. Даты в формате YYYY/mm/dd. Ниже представлена ​​структура XML.Как сортировать даты в XSL?

Чтобы быть более конкретным, я приводил пример ниже. Предположим, что есть 3 Положения Срок действия 2015/01/01, 2015/01/02, 2015/01/03, тогда customerEffectiveDate должен быть обновлен до 2015/01/03.

Вопросы, относящиеся к структуре XML: 1. Количество товаров может быть от 1 до 10. 2. Узел покрытия может быть от 1 до многих.

<Map> 
    <customer> 
     <customerDetails> 
      <!-- The customerEffectiveDate below should be updated to the latest among all the effectiveDate fron coverage.--> 
      <customerEffectiveDate>2014/06/02</customerEffectiveDate> 
     </customerDetails> 
    </customer> 
    <products> 
     <product1> 
      <!-- Coverage Nodes can occur multiple times. There is no limit.--> 
      <coverage> 
       <effectiveDate>2015/12/01</effectiveDate> 
      </coverage> 
      <coverage> 
       <effectiveDate>2015/11/01</effectiveDate> 
      </coverage> 
     </product1> 
     <product2> 
      <coverage> 
       <effectiveDate>2014/12/01</effectiveDate> 
      </coverage> 
      <coverage> 
       <effectiveDate>2015/09/01</effectiveDate> 
      </coverage> 
     </product2> 
     . 
     . 
     . 
     . 
     . 
     . 
     . 
     . 

     <product10></product10> 
    </products> 
</Map> 

Еще один момент, который нужно отметить, это использование XSL 1.0. Может кому-то помочь.

Я уже посмотрел this, this и this.

Спасибо.

ответ

1

Учитывая, что формат, который вы можете легко сортировать его, написать шаблон

<xsl:template match="customer/customerDetails/customerEffectiveDate"> 
    <xsl:copy> 
    <xsl:for-each select="//coverage/effectiveDate"> 
     <xsl:sort select="." data-type="text" order="descending"/> 
     <xsl:if test="position() = 1"> 
     <xsl:value-of select="."/> 
     </xsl:if> 
    </xsl:for-each> 
</xsl:copy> 
</xsl:template> 

плюс шаблон тождественного преобразования

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

копировать остальные без изменений.

+0

Что делает условие ? И что такое шаблон преобразования идентичности? – Sam

+0

Я редактировал код, чтобы показать, как выглядит шаблон преобразования идентификаторов. Что касается проверки, ну, код сортируется в порядке убывания, а затем берет первое значение, самую последнюю дату и выводит его. –

1

Это не может быть самым простым способом, но этот подход сортирует все тег <coverage> под <product1-10> тегов, извлекает последнее значение из всех <effectiveDate> значений и копии остальных.

<?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="node()|@*"> 
    <xsl:copy> 
    <xsl:apply-templates select="node()|@*"/> 
    </xsl:copy> 
</xsl:template> 

<!-- Process <products> tag with higher priority, so that the follwing template does not match --> 
<xsl:template match="products" priority="1"> 
    <xsl:copy> 
    <xsl:apply-templates select="node()|@*"/> 
    </xsl:copy> 
</xsl:template> 

<xsl:template match="*[starts-with(local-name(),'product')]"> 
    <xsl:element name="{name()}"> 
    <xsl:for-each select="coverage"> 
     <xsl:sort select="effectiveDate/text()" order="descending" /> 
     <xsl:copy-of select="." /> 
    </xsl:for-each> 
    </xsl:element> 
</xsl:template> 

<!-- extract the first 'effectiveDate' after sorting all values --> 
<xsl:template match="customerEffectiveDate"> 
    <xsl:variable name="latest"> 
    <xsl:for-each select="../../../products//effectiveDate"> 
     <xsl:sort select="text()" order="descending" /> 
     <xsl:if test="position() = 1"> 
     <xsl:value-of select="." /> 
     </xsl:if> 
    </xsl:for-each> 
    </xsl:variable> 
    <customerEffectiveDate><xsl:copy-of select="$latest" /></customerEffectiveDate> 
</xsl:template> 

</xsl:stylesheet> 
Смежные вопросы