2011-01-26 1 views
0

xsl 매퍼의 성능에 문제가 있습니다.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 초입니다 : 여기에 몇 가지 예를 들어, XSL (실제 XSL 10 000 선에 대해 다음과 같이 계속 주)입니다 이게 정상인가요? 나는이 맵핑을 일반적으로 초당 10 개 이상의 메시지를 처리 ​​할 수있는 biztalk에서 사용하지만이 맵은 지연을 일으키므로 초당 1 개의 메시지 만 처리 할 수 ​​있습니다. (

누군가가 나에게 조언을 줄 수있는, 그래서 만약 아니라 XSL 전문가 불행히도, 내가 노드를 복사

+0

원본 메시지가 어떤 크기인지는 알지 못합니다. 실행 시간을 결정하는 주요 요인이 될 것입니다. 실행 시간을 측정하는 방법에 대해서도 말하지 않고 XML 파싱 시간을 포함하고 있습니까? 실행 시간이 원본 문서 크기에 따라 선형 적으로 (즉) 2 차원 적으로 변하는 지 여부를 확인하여 유용한 진단을 얻을 수 있습니다. 즉, 크기가 두 배로 늘어나면 경과 시간이 2 배나 4 배나 악화됩니까? 2 차적이라면 xsl : key를 현명하게 사용하여 문제를 해결할 수 있습니다. –

+0

귀하의 질문에 실제로 답변하지는 않지만. 성능, 빈 노드를 제거하기위한 '귀여운'반복적 인 XSLT 템플릿 매칭 알고리즘이 있습니다. 이렇게하면 많은 코딩을 줄일 수 있습니다. 예 : http://www.stylusstudio.com/xsllist/200403/post50690.html – StuartLC

+0

잘 작성된 XML을 게시 하시겠습니까? 필자는 코드를 올바르게 형식화 할 수 없으며이를 분석하고 이해하는 것에 대해 말하지 않습니다. –

답변

2

내가

나는 복사하지 마십시오 소스 XML에서 원하는 오신 것을 환영합니다 :)

들으이다 빈 노드 또는 중단 (따라서 내가 normalize- 공간을 확인하는 이유)을 포함하는 노드

처음으로, 나는 당신이 오버라이드와 함께 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 ​​() | @ *)]' –