我遇到了xsl映射器的性能问题。 下面是一些示例xsl(注意:真正的xsl会像这样继续10 000行)
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:msxsl="urn:schemas-microsoft-com:xslt" xmlns:var="http://schemas.microsoft.com/BizTalk/2003/var" exclude-result-prefixes="msxsl var" version="1.0" xmlns:ns3="http://microsoft.com/HealthCare/HL7/2X/2.3.1/Tables" xmlns:ns4="http://microsoft.com/HealthCare/HL7/2X/2.3.1/DataTypes" xmlns:ns0="http://microsoft.com/HealthCare/HL7/2X/2.3.1/Segments" xmlns:ns2="http://microsoft.com/HealthCare/HL7/2X" xmlns:ns1="http://Cegeka.C2M.Accelerator.Schemas.segments_C2M">
<xsl:output omit-xml-declaration="yes" method="xml" version="1.0" />
<xsl:template match="/">
<xsl:apply-templates select="/ns2:ADT_231_GLO_DEF" />
</xsl:template>
<xsl:template match="/ns2:ADT_231_GLO_DEF">
<ns2:ADT_231_GLO_DEF>
<xsl:for-each select="EVN_EventType">
<EVN_EventType>
<xsl:if test="normalize-space(EVN_1_EventTypeCode/text())">
<EVN_1_EventTypeCode>
<xsl:value-of select="EVN_1_EventTypeCode/text()" />
</EVN_1_EventTypeCode>
</xsl:if>
<EVN_2_RecordedDateTime>
<xsl:if test="normalize-space(EVN_2_RecordedDateTime/TS_0_TimeOfAnEvent/text())">
<TS_0_TimeOfAnEvent>
<xsl:value-of select="EVN_2_RecordedDateTime/TS_0_TimeOfAnEvent/text()" />
</TS_0_TimeOfAnEvent>
</xsl:if>
</EVN_2_RecordedDateTime>
<xsl:for-each select="EVN_3_DateTimePlannedEvent">
<xsl:if test="normalize-space(TS_0_TimeOfAnEvent/text())">
<EVN_3_DateTimePlannedEvent>
<TS_0_TimeOfAnEvent>
<xsl:value-of select="TS_0_TimeOfAnEvent/text()" />
</TS_0_TimeOfAnEvent>
</EVN_3_DateTimePlannedEvent>
</xsl:if>
</xsl:for-each>
<xsl:if test="normalize-space(EVN_4_EventReasonCode/text())">
<EVN_4_EventReasonCode>
<xsl:value-of select="EVN_4_EventReasonCode/text()" />
</EVN_4_EventReasonCode>
</xsl:if>
</EVN_EventType>
</xsl:for-each>
</ns2:ADT_231_GLO_DEF>
</xsl:template>
</xsl:stylesheet>
所以我正在做的是:
- I copy the nodes I want from the source xml
- I don't copy the empty nodes or the nodes that contain a break (hence why I check normalize-space(/text())
现在执行时间大约是1秒,这是正常的吗?我在biztalk中使用这个映射,它通常每秒至少处理10条消息(如果不是更多:p)但是这个映射导致延迟,所以我每秒只能处理1条消息:(
现在我不是一个xsl大师不幸,所以如果有人能给我一些建议,欢迎:)
THX
答案 0 :(得分:2)
我从源xml
复制我想要的节点我不复制空节点或包含中断的节点(因此我检查规范化空间的原因)
首先,我建议你可以使用带有覆盖的身份转换。例如,下面的代码将复制所有元素,不包括那些“带空(在空白规范化之后)字符串值而没有子元素或属性”。
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes"/>
<xsl:template match="@* | node()">
<xsl:copy>
<xsl:apply-templates select="@* | node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="*[not(normalize-space()) and not(*) and not(@*)]"/>
</xsl:stylesheet>
第二次,您可以尝试使用以下命令在编译时删除未使用的空格:
<xsl:strip-space elements="*"/>
通过这种方式,您的文档将保存在内存中,而不会显示无关紧要的空格,从而更加简洁。