2011-01-26 11 views
0

xslマッパーのパフォーマンスに問題があります。 はここにいくつかの例のXSL(注:実際のXSLは10の000行のために、このようになります)されxslパフォーマンスの問題

<?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秒ですこれは正常ですか?私はこのマッピングを通常1秒間に少なくとも10個のメッセージを処理できるビズトークで使用しますが、このマップは遅延を引き起こしているので、1秒間に1メッセージしか処理できません:(

今私は残念ながらありませんXSLの第一人者、誰もが私にいくつかのアドバイスを与えることができる場合ので、それは大歓迎です:)

Thxを

+0

ソースメッセージのサイズは、実行時間を決定する主な要因になります。また、実行時間をどのように測定しているのかも言わないでください - XML解析時間も含めていますか?実行時間がソース文書サイズで直線的に変化するのか、それとも二倍に変化するのか、つまりサイズが倍増すると経過時間が2倍か4倍か悪化するかどうかを確認することで、有用な診断を得ることができます。二次関数の場合は、xsl:keyを賢明に使用して問題を解決することができます。 –

+0

あなたの質問に実際には触れていませんが。パフォーマンス、いくつかの 'かわいい'再帰的なXSLTのテンプレートマッチングアルゴリズムは、一般的に空のノードを取り除く - これはあなたに多くのコードを保存する可能性がありますか?例えばhttp://www.stylusstudio.com/xsllist/200403/post50690.html – StuartLC

+0

整形式のXMLを投稿することはできますか?私はあなたのコードを適切にフォーマットすることさえできず、それを分析して理解することについては話しません。 –

答えて

2

は、私は、ソースXML

から私が欲しいのノードをコピーし、私はコピーしないでください空のノードまたはブレークを含むノード(したがって、正規化スペースを確認する理由)

最初にを指定すると、上書きのID変換を使用することをお勧めします。例えば、以下のコードは、 "空白(空白の正規化後)の文字列値を持ち、子要素または属性を持たない"ものを除くすべての要素をコピーします。

<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="*"/> 

あなたの文書が無意味な空白なしでメモリに保持されますので、になります。この方法より簡潔に。

+0

ありがとうございます。しかし、この方法はパフォーマンスに悪いことではありませんか?それは各ノード上で繰り返さなければならないからです。thx :) –

+1

これは確かに、多くのif文よりも自然な方法です。あなたは少なくともそれをテストすることができます。 – Flack

+0

+1開始点のアドバイス... 'xsl:strip-space'が適切であれば(XHMTL入力ではない)、パターンは' * [not(node()| @ *)] ' –