У меня возникла проблема, когда я получаю XML-файл, и из образцов, которые я получаю в формате даты, которую я получаю, является mm/dd/yyyy
, а иногда это m/d/yyyy
. Моя задача - преобразовать это в другой XML-файл, в котором схема принимает только yyyy-mm-dd
. Я ограничен использованием XSLT 1.0/XPATH 1.0. Как я могу это сделать?Формат даты преобразования XSLT
ответ
Ваш вопрос немного расплывчатый. Он нуждается в некотором образце ввода и ожидаемом выходе. Но в любом случае, вот ответ на лучшее предположение о том, чего вы хотите.
Учитывая этот вход:
<?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
Решение Dogbane довольно похоже на мое, но он избил меня до удара. Тем не менее, я думаю, что мое решение является более кратким и лучше читается. Решение McLaren не будет работать в таких датах, как 1/12/2012, длина строки 9. –
Мой 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
Пожалуйста, не используйте '
спасибо, что указал. Я обновил свой ответ. – dogbane
Привет, команда! См. Ниже, выставляя format-dateTime: http://stackoverflow.com/a/16892467/2816548 –
- 1. XSLT формат даты преобразования в ISO
- 2. Формат даты сравнить даты XSLT
- 3. Формат даты в XSLT
- 4. формат даты преобразования
- 5. Java формат даты преобразования
- 6. Android формат даты преобразования
- 7. Формат преобразования даты javascript
- 8. формат поля даты преобразования
- 9. Формат даты преобразования Vertica
- 10. Java формат даты преобразования
- 11. формат преобразования даты
- 12. Строка преобразования XSLT в формат даты и времени
- 13. преобразования формата даты XSD с помощью XSLT
- 14. Формат даты преобразования Простой Дата
- 15. Java: Формат даты проблема преобразования
- 16. преобразования VARCHAR в формат даты
- 17. XSLT для преобразования XML в иерархический формат
- 18. XSLT для преобразования XML в другой формат
- 19. Формат даты XSLT с использованием подстроки
- 20. Преобразовать формат даты и времени в XSLT
- 21. XSLT: формат даты на длинную дату
- 22. Как извлечь этот формат даты в XSLT
- 23. Как изменить формат даты в XSLT?
- 24. формат даты в XSLT версии 1
- 25. преобразования строки в JSON формат даты
- 26. формат преобразования даты с использованием SAS
- 27. Формат даты преобразования в PHP 5.1.2
- 28. sql формат преобразования даты и времени
- 29. Как указать формат преобразования даты в строку
- 30. определить формат даты в R до преобразования
Так как бы вы толковали '11/12/2012 '? Вам необходимо уточнить свой вопрос с правилами о том, какой из двух форматов применяется в каких случаях. –
С исходной схемой, состоящей из 11/12/2012, целевая схема должна быть такой, как 2012-11-12 (интерпретируется как 12 ноября 2012 года). – TimWagaman