XSLT优化xsl:choose和str:tokenize

时间:2017-08-24 18:09:57

标签: xslt optimization

我一直在研究并且无法找到与优化XSLT相关的任何内容。下面是我正在处理的片段,并希望了解是否可以采取任何措施来帮助进行xslt转换。

<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>

1 个答案:

答案 0 :(得分:1)

我建议编写像

这样的代码
<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:template match="a:OBR/OBR-10[string-length() = 0]">
  <xsl:copy>USER</xsl:copy>
</xsl:template>

或者

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

即,编写匹配每个元素的模板,如果需要谓词/条件而不是奇怪的方法匹配*,然后测试名称。我不认为这必然是一种优化(您必须使用特定的实现来衡量),而是作为一种清晰的模块化编码风格。

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

将代码作为

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

或者可能已经被身份转换模板所覆盖,该模板被设置为启动和保持处理的起点。

您必须在输入文档和XSLT中显示名称空间,以便根据名称空间提供精确的建议(可能是您想要/需要xsl:template match="a:OBR/a:OBR-10[string-length() = 0]")。