我们正在使用Tibco BusinessWorks将XML文档传递给Tibco BusinessEvents流程。由于BusinessEvents没有DATE格式,只有DATETIME,因此我们必须在发送到BusinessEvents之前更改源XML文档中的日期,并将响应的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>
虽然功能齐全,但这并不理想。我宁愿不必枚举我需要转换的每个元素,我宁愿指定一个需要转换的TYPE。
(1) XSL是否提供此功能?
(2)或者,有些元素名称可能在一个位置为DATE,在其他位置为DATETIME。如果我按名称知道父级,是否有一种排除某些DATETIME元素的有效方法?
(3)最后,是否有人认为超出问题范围的增强空间?
某些上下文:原始映射在BusinessWorks的编辑器中完成,其中GUI生成自己的映射文件,数百行if / then / else语句。对于一个50k文档(我们的平均值),对于一个在不到50ms的时间内完成其实际工作的Web服务,这相当于每次转换的近20ms开销。这是必须改进的瓶颈。
答案 0 :(得分:2)
只需使用:
<xsl:template match="*[. castable as xs:date]">
<!-- Your code here -->
</xsl:template>