我一直在研究并且无法找到与优化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]) > 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>
答案 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]"
)。