XSLT Optimizing xsl:choose and str:tokenize



我一直在研究,但找不到与优化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>

我建议编写这样的代码

<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]"(。

最新更新