2015-04-24 3 views
0

Я не самый опытный в преобразовании XML/XSL, поэтому, пожалуйста, со мной.Преобразование XSL, зависящее от даты

В настоящее время я выводил в txt файлы большое количество кодов продуктов и различные атрибуты, содержащиеся в них. «Конечная дата товара» - один из выданных атрибутов.

Есть ли способ запросить это значение атрибута, чтобы сказать, что он выполняет только функции XSL, если Дата окончания объекта после сегодняшней даты?

Я использую Altova, если это помогает.

Заранее благодарен!

XML:

<Agility> 
<group> 
    <product id="295826" subtype="CMS Product" created="20/04/12" modified="03/03/15"> 
     <attribute definition_id="26" modified="20/04/12" is_name="true" is_identifier="true" scope="global" type="text"> 
      <data language="English" label="CMS Product Name"></data> 
     </attribute> 
     <attribute definition_id="278" modified="28/08/08" scope="global" type="datetime"> 
      <data language="English" label="Item End Date">01/01/99</data> 
     </attribute> 
    </product> 
</group> 

XSL:

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


<xsl:template match="product[@subtype = 'CMS Product']"> 

<xsl:for-each select="attribute"> 
    <xsl:if test="@definition_id = 278"> 
    <xsl:value-of select="data" /> 
    </xsl:if> 
</xsl:for-each> 

</xsl:template> 
</xsl:stylesheet> 
+0

Сам по себе XSLT 1.0 не дает возможности получить текущую дату. Вы можете передать текущую дату в качестве параметра в таблицу стилей во время выполнения, или - если ваш конкретный XSLT-процессор поддерживает ее - используйте функцию расширения. Altova не является XSLT-процессором. Получите имя фактического процессора, который вы используете, см. Здесь, как: http://stackoverflow.com/questions/25244370/how-can-we-check-that-which-xslt-processor-uses-as-default-in -solr/25245033? s = 1 | 0.1827 # 25245033 –

+0

Благодарим за отзыв Michael - Confirmed Altova GmbH Version 2.0 –

+0

В XSLT 2.0 вы можете использовать функцию 'current-date()'. Однако, прежде чем вы сможете сравнить это с вашими значениями «Конечная дата», вы должны преобразовать их в действительный формат xs: date (например, «2015-04-24»). Если, как кажется, ваши данные имеют 2-значные годы и могут вернуться к 1999 году или ранее, это займет определенную работу. –

ответ

1

Попробуйте это так?

<xsl:template match="product"> 
    <xsl:variable name="end" select="attribute/data[@label='Item End Date']" /> 
    <xsl:variable name="end-date" select="xs:date(concat('20', substring($end, 7, 2), '-', substring($end, 4, 2), '-',substring($end, 1, 2)))" /> 
    <xsl:if test="$end-date gt current-date()"> 
     <!-- do your processing here --> 
    </xsl:if> 
</xsl:template> 
+0

Майкл, который вам очень пригодился! Это спасет меня так много времени каждый день! –

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