2012-04-30 9 views
2

У меня возникла проблема, когда я получаю XML-файл, и из образцов, которые я получаю в формате даты, которую я получаю, является mm/dd/yyyy, а иногда это m/d/yyyy. Моя задача - преобразовать это в другой XML-файл, в котором схема принимает только yyyy-mm-dd. Я ограничен использованием XSLT 1.0/XPATH 1.0. Как я могу это сделать?Формат даты преобразования XSLT

+0

Так как бы вы толковали '11/12/2012 '? Вам необходимо уточнить свой вопрос с правилами о том, какой из двух форматов применяется в каких случаях. –

+0

С исходной схемой, состоящей из 11/12/2012, целевая схема должна быть такой, как 2012-11-12 (интерпретируется как 12 ноября 2012 года). – TimWagaman

ответ

8

Ваш вопрос немного расплывчатый. Он нуждается в некотором образце ввода и ожидаемом выходе. Но в любом случае, вот ответ на лучшее предположение о том, чего вы хотите.

Учитывая этот вход:

<?xml version="1.0"?> 
<dates> 
    <date>11/12/2012</date> 
    <date>3/4/2011</date> 
</dates> 

... трансформировал этот стиль листы ...

<?xml version="1.0"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output method="xml" indent="yes"/> 

     <xsl:template match="dates"> 
     <xsl:copy> 
     <xsl:apply-templates select="*" /> 
     </xsl:copy> 
     </xsl:template> 

     <xsl:template match="date"> 
     <xsl:copy> 
     <xsl:value-of select=" 
      concat(
      substring-after(substring-after(.,'/'),'/') , '-', 
      format-number(number(substring-before(.,'/')), '00') , '-', 
      format-number(substring-before(substring-after(.,'/'),'/'), '00') 
      ) 
      " /> 
     </xsl:copy> 
     </xsl:template> 

</xsl:stylesheet> 

... будет производить этот желаемый результат ...

<dates> 
<date>2012-11-12</date> 
<date>2011-03-04</date> 
</dates> 

Пожалуйста, отметьте ответ, если он правильный. Я проверил это решение на http://www.purplegene.com/static/transform.html

+0

Решение Dogbane довольно похоже на мое, но он избил меня до удара. Тем не менее, я думаю, что мое решение является более кратким и лучше читается. Решение McLaren не будет работать в таких датах, как 1/12/2012, длина строки 9. –

1

Мой XSLT, показанный ниже, должен работать. Он не использует жестко закодированные длины или индексы, а вместо этого разбивает строку даты на «/», чтобы определить, где находятся компоненты дня, месяца и года.

XSLT:

<?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" /> 

    <xsl:template match="/"> 
     <xsl:apply-templates /> 
    </xsl:template> 

     <!-- match the date and invoke formatDate to format it --> 
    <xsl:template match="date"> 
     <xsl:element name="date"> 
      <xsl:call-template name="formatDate"> 
       <xsl:with-param name="dateParam" select="." /> 
      </xsl:call-template> 
     </xsl:element> 
    </xsl:template> 

    <xsl:template name="formatDate"> 
     <xsl:param name="dateParam" /> 
     <!-- input format mm/dd/yyyy or m/d/yyyy --> 
     <!-- output format yyyy-mm-dd --> 


     <!-- parse out the day, month and year --> 
     <xsl:variable name="month" select="substring-before($dateParam,'/')" /> 
     <xsl:variable name="day" select="substring-before(substring-after($dateParam,'/'),'/')" /> 
     <xsl:variable name="year" select="substring-after(substring-after($dateParam,'/'),'/')" /> 

     <!-- now print them out. Pad with 0 where necessary. --> 
     <xsl:value-of select="$year" /> 
     <xsl:value-of select="'-'" /> 
     <xsl:if test="string-length($month) = 1"> 
      <xsl:value-of select="'0'" /> 
     </xsl:if> 
     <xsl:value-of select="$month" /> 
     <xsl:value-of select="'-'" /> 
     <xsl:if test="string-length($day) = 1"> 
      <xsl:value-of select="'0'" /> 
     </xsl:if> 
     <xsl:value-of select="$day" /> 
    </xsl:template> 

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

</xsl:stylesheet> 

Входной сигнал:

<input> 
    <date>04/30/2012</date> 
    <date>4/1/2012</date> 
</input> 

Выход:

<?xml version="1.0" encoding="UTF-8"?> 
<input> 
    <date>2012-04-30</date> 
    <date>2012-04-01</date> 
</input> 

Демо-версия: http://www.xsltcake.com/slices/kBveVQ

+0

Пожалуйста, не используйте '', когда вы можете использовать ''. Это многословие и неэффективность! –

+0

спасибо, что указал. Я обновил свой ответ. – dogbane

+0

Привет, команда! См. Ниже, выставляя format-dateTime: http://stackoverflow.com/a/16892467/2816548 –

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