2009-09-10 3 views
0

Я определил шаблонКак сделать расчет на дату

<xsl:template match="DBE:Object" mode="TestTable"> 
    <table width="100%" border="0"> 
     <tr> 
     Delivery Date 
     Latest Possible Order Date 
     </tr> 
     <xsl:apply-templates select="DBE:Attribute[@name='DeliveryDate']/DBE:Date/> 
     <xsl:apply-templates select="DBE:Attribute[@name='LatestOrderDate']"/> 
    </table> 
</xsl:template> 

Теперь я хочу, чтобы вычислить «LatestOrderDate» = «DeliveryDate» - 42 дней. Как мне это сделать?

+0

ум правильно форматировать шаблон (использование «Пример кода» для XML-кода/XSL поэтому мы можем видеть специальные символы)? –

ответ

0

Вы должны быть немного более подробными. Если вы должны придерживаться XSLT 1.0, я бы recommed EXSLT http://www.exslt.org или образцы кода из Sal Мангано 1-е издание «XSLT Поваренная книга», изданной O'Reilly см www.oreilly.de/catalog/9780596003722/

Если я понимаю, это правильно, первый столбец содержит дату доставки, а lastOrderDate будет сохранен в новый правый столбец. Содержимое всех остальных столбцов будет скопировано дословно.

Идея состоит в том, чтобы сначала опросить содержимое первого столбца и сохранить его в переменной deliveryDate. После этого будут обработаны дочерние элементы TableData. При достижении последнего элемента TableData в каждую строку таблицы добавляется новая ячейка таблицы, содержащая результат вычисления lastOrderDate.

См. Образец кода в моем втором ответе.

+0

Я использую XSLT 1.0, и дата определена в образе - 2009-09-22 – 2009-09-14 09:28:42

+0

Используя EXSLT, вы можете использовать шаблон функции date: add(), чтобы получить то, что вы хотите. Просто поставьте deliveryDate в переменную и позвоните: дата: add ($ deliveryDate, '-P42D') где -P42D - это литерал длительности xsd: длительность 42 дней, указывающая назад в прошлое. – 2009-09-16 09:17:56

+0

Можете ли вы привести пример для этого? – 2009-09-16 11:02:30

0

«Пример кода»

 
<xsl:template match="DBE:Attribute[@name='TestTable']/DBE:Table/DBE:TableRow"> 
    <xsl:variable name="deliveryDate" select="string(DBE:TableData[position()=1])"/> 
    <tr> 
    <xsl:apply-templates mode="table" select="DBE:TableData"> 
     <xsl:with-param name="deliveryDate" select="$deliveryDate"/> 
    </xsl:apply-templates> 
    </tr> 
</xsl:template> 

<xsl:template mode="table" match="DBE:TableData"> 
    <xsl:param name="deliveryDate"/> 
    <td> 
    <xsl:value-of select="string(.)"/> 
    </td> 
    <xsl:if test="count(following-siblings::DBE:TableData)=0"> 
    <td> 
     <xsl:value-of select="date:add($deliveryDate, '-P42D')"/> 
    </td> 
    </xsl:if> 
</xsl:template> 
Смежные вопросы