2017-08-24 2 views
0

Ich habe recherchiert und konnte nichts in Bezug auf die Optimierung von XSLT finden. Unten ist das Snippet, an dem ich arbeite und wollte sehen, ob etwas getan werden kann, um mit der xslt-Transformation zu helfen.XSLT Optimierung xsl: choose und str: tokenize

<xsl:template match="a:OBR/*"> 
    <xsl:choose> 
     <xsl:when test ="name() = 'OBR-10' and string-length(.) = 0"> 
     <OBR-10>USER</OBR-10> 
     </xsl:when> 
     <xsl:when test ="name() = 'OBR-18'"> 
     <OBR-18> 
      <xsl:value-of select ="//a:PV1/a:PV1-44"/> 
     </OBR-18> 
     </xsl:when> 
     <xsl:when test ="name() = 'OBR-19'"> 
     <OBR-19> 
      <xsl:if test = "string-length(str:tokenize(../a:OBR-18,'^')[5]) &gt; 0"> 
       <xsl:value-of select ="str:tokenize(../a:OBR-18,'^')[5]"/> 
      </xsl:if> 
     </OBR-19> 
     </xsl:when> 
     <xsl:when test ="name() = 'OBR-33'"> 
     <OBR-33> 
      <xsl:value-of select ="translate(../parent::a:ORC[1]/a:ORC-4,'^','~')"/> 
     </OBR-33> 
     </xsl:when> 
     <xsl:when test="name()='NTE'"> 
     <NTE> 
      <xsl:apply-templates/> 
     </NTE> 
     </xsl:when> 
     <xsl:when test="name()='DG1'"/> 
     <!--<DG1> 
      <xsl:apply-templates/> 
     </DG1> 
     </xsl:when>--> 
     <xsl:when test="name()='OBX'"> 
     <OBX> 
      <xsl:apply-templates/> 
     </OBX> 
     </xsl:when> 
     <xsl:otherwise> 
     <xsl:copy-of select="."/> 
     </xsl:otherwise> 
    </xsl:choose> 
    </xsl:template> 

Antwort

0

Ich würde vorschlagen, Code zu schreiben, wie

<xsl:template match="a:OBR/*"> 
    <xsl:choose> 
     <xsl:when test ="name() = 'OBR-10' and string-length(.) = 0"> 
     <OBR-10>USER</OBR-10> 
     </xsl:when> 

als

<xsl:template match="a:OBR/OBR-10[string-length() = 0]"> 
    <xsl:copy>USER</xsl:copy> 
</xsl:template> 

oder vielleicht

<xsl:template match="a:OBR/OBR-10[. = '']"> 
    <xsl:copy>USER</xsl:copy> 
</xsl:template> 

, das heißt, zu Vorlagen zu schreiben, die jedes Element passen durch ihre Name und ggf. ein Prädikat/c ondition statt dieser ungeraden Annäherung, um auf * zusammenzupassen und dann den Namen zu prüfen. Ich sehe das nicht notwendigerweise als Optimierung (Sie müssten mit einer bestimmten Implementierung messen), sondern als klaren und modularen Codierungsstil.

Der

<xsl:otherwise> 
    <xsl:copy-of select="."/> 
    </xsl:otherwise> 

würde dann Code sein, wie

<xsl:template match="a:OBR/*"> 
    <xsl:copy-of select="."/> 
</xsl:template> 

oder wahrscheinlich schon durch eine Identitätstransformation Vorlage bedeckt als Ausgangspunkt einrichten zu initiieren und die Verarbeitung zu halten.

Sie müssten die Namespaces im Eingabedokument und in der XSLT anzeigen, um einen präzisen Vorschlag in Bezug auf Namespaces zu geben (könnte sein, dass Sie xsl:template match="a:OBR/a:OBR-10[string-length() = 0]" wollen/brauchen).

+0

Dank Martin, wie würde ich die zwei verschiedenen Optionen messen? – Mcdevitt

+0

Das hängt vom XSLT-Prozessor und der Host-Umgebung ab, die Sie verwenden. Sie müssen überprüfen, ob Ihr XSLT-Prozessor eine Option zur direkten Ausgabe leistungsbezogener Daten wie Verarbeitungszeit und Speicherverbrauch hat oder Sie die Hostsprache verwenden müssen Java, C, C#, ...) verwenden Sie die XSLT und schreiben Sie etwas Code, um die XSLT-Transformation zeitlich abzustimmen, möglicherweise zusammen mit OS-spezifischen Tools. In jedem Fall würde ich das nur tun, wenn beim Ausführen des XSLT Probleme auftreten. –

+0

Klingt gut würden Sie etwas mit diesem Code ändern Mcdevitt