Гибкое преобразование XSL Date/DateTime

Мы используем Tibco BusinessWorks для передачи XML-документа в процесс Tibco BusinessEvents. Поскольку BusinessEvents не имеет формата DATE, а только DATETIME, мы должны изменить даты в исходном XML-документе перед отправкой в ​​BusinessEvents и сопоставить значения DateTime ответа с простыми датами.

Это и раздражает, и утомительно.

Пытаясь улучшить производительность 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>

While functional, this not ideal. I'd prefer NOT to have to enumerate each element I need transformed, I'd rather specify a TYPE that needs to be converted.

(1) Предлагает ли XSL эту функцию?

(2) Кроме того, некоторые имена элементов могут быть DATE в одном месте и DATETIME в другом. Есть ли эффективный способ исключения некоторых элементов DATETIME, если я знаю родителя по имени?

(3) Наконец, кто-нибудь видит возможности для улучшения, выходящие за рамки вопроса?

Некоторый контекст: исходное сопоставление выполняется в редакторе BusinessWorks, где графический интерфейс создает собственный файл сопоставления, состоящий из нескольких сотен строк операторов if/then/else. Для документа размером 50 КБ (наше среднее значение) это составляет почти 20 мс накладных расходов на преобразование для веб-службы, которая выполняет свою фактическую работу менее чем за 50 мс. Это узкое место, которое необходимо устранить.


person JHarnach    schedule 13.03.2013    source источник


Ответы (1)


Просто используйте:

<xsl:template match="*[. castable as xs:date]">
 <!-- Your code here -->
</xsl:template>
person Dimitre Novatchev    schedule 14.03.2013
comment
Так невероятно просто, именно то, что мне нужно. Спасибо! - person JHarnach; 14.03.2013
comment
@JHarnach, пожалуйста. И да, XSLT является одновременно мощным и элегантным. Посмотрите XSLT 3.0, чтобы узнать о новых возможностях, которые немногие могли себе представить. - person Dimitre Novatchev; 14.03.2013