Гибкое преобразование даты / даты и времени в XSL
Мы используем Tibco BusinessWorks для передачи XML-документа процессу Tibco BusinessEvents. Поскольку BusinessEvents не имеет формата DATE, только DATETIME, мы должны изменить Dates в исходном XML-документе перед отправкой в BusinessEvents и отобразить значения DateTime ответа обратно в простые Dates.
Это и раздражает, и обременительно.
В попытке улучшить производительность BusinessWorks я пишу таблицу стилей для обработки сопоставления. Вот что у меня есть.
<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:inf="http:/the.company.namespace">
<xsl:template match="node()">
<xsl:copy>
<xsl:apply-templates select="node()" />
</xsl:copy>
</xsl:template>
<xsl:template match="inf:PriorExpirationDate | inf:OrderDate | inf:SegmentEffectiveDate |
inf:SegmentExpirationDate | inf:CancelDate | inf:NewBusinessEffectiveDate |
inf:NewBusinessExpirationDate | inf:RenewalEffectiveDate | inf:RenewalExpirationDate |
inf:QuestionDate | inf:ViolationDate | inf:ConvictionDate |
inf:EffectiveDate | inf:RatingDate | inf:AdvanceDate |
inf:SIDRevisionDate | inf:DriverLicensedDate |
inf:ESignatureDate | inf:UploadDate | inf:CancelDate |
inf:CancelProcessedDate | inf:CancelEffectiveDate | inf:CreatedDate |
inf:QuoteCreationDate | inf:QuoteModifiedDate | inf:QuoteExpirationDate |
inf:RateStartDate | inf:RateEndDate | inf:ChangeEffectiveDate | inf:PostDate |
inf:EffectiveDate | inf:ExpirationDate | inf:BirthDate |
inf:InstallmentDueDate | inf:CommercialDriverLicenseDate ">
<xsl:element name="{name()}">
<xsl:value-of
select="concat(format-date(text(),'[Y0001]-[M01]-[D01]'), 'T00:00:00')" />
</xsl:element>
</xsl:template>
Хотя это функционально, это не идеально. Я бы предпочел НЕ перечислять каждый элемент, который мне нужно преобразовать, я бы предпочел указать ТИП, который нужно преобразовать.
(1) XSL предлагает эту функцию?
(2) В качестве альтернативы, есть некоторые имена элементов, которые могут быть DATE в одном месте и DATETIME в других. Есть ли эффективный способ исключения некоторых элементов DATETIME, если я знаю родителя по имени?
(3) Наконец, кто-нибудь видит возможности для улучшения за рамками вопроса?
Немного контекста. Исходное сопоставление выполняется в редакторе BusinessWorks, где графический интерфейс создает собственный файл сопоставления, состоящий из нескольких сотен строк операторов if / then / else. Для документа размером 50 тыс. (Наше среднее значение) это составляет около 20 мс на преобразование для веб-службы, которая выполняет свою работу менее чем за 50 мс. Это узкое место, которое должно быть исправлено.
1 ответ
Просто используйте:
<xsl:template match="*[. castable as xs:date]">
<!-- Your code here -->
</xsl:template>