我正处于将ASP.Net 1.1应用程序升级到.Net 3.5的过程中,我所做的一项更改是使用XslCompiledTransform而不是XslTransform。我正在运行一些测试XSLT,以确保当我发现使用新方法失败的XSLT时一切正常。
经过一番调查后,我发现XSLT有一个巨大的xsl:choose语句,条件为435,示例如下: -
<xsl:choose>
<xsl:when test=".='0'">Not Applicable</xsl:when>
<xsl:when test=".='A01'">Hartlepool</xsl:when>
<xsl:when test=".='A02'">North Tees</xsl:when>
....为了理智而缩写......
<xsl:when test=".='ZE0'">Eastern Board</xsl:when>
<xsl:when test=".='ZN0'">Northern Board</xsl:when>
<xsl:when test=".='ZS0'">Southern Board</xsl:when>
<xsl:when test=".='ZW0'">Western Board</xsl:when>
<xsl:otherwise>N/A</xsl:otherwise>
</xsl:choose>
注释掉上面的xsl:choose允许转换工作但是将其保留在当前崩溃我的IIS应用程序池中,唯一的解决方案是重新启动应用程序池。
我意识到435条件选择语句由于各种原因不是一个好主意(我继承了这段代码,请不要反对我),我将以另一种方式解决这个特殊问题我很感兴趣为什么以前使用XslTransform工作但不使用XslCompiledTransform。有什么特别需要注意的事情,或者这个特别大的选择陈述只是一次性的。
答案 0 :(得分:2)
我不知道这种行为的原因,但您可以通过使用查找表和document()
函数解决此问题:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:variable name="table">
<table>
<item id="0">Not applicable</item>
<item id="A01">Hartlepool</item>
<item id="A02">North Tees</item>
</table>
</xsl:variable>
<xsl:template match="test">
<test>
<xsl:value-of select="document('')//table/*[@id=current()][1]"/>
</test>
</xsl:template>
</xsl:stylesheet>
请注意,默认情况下会禁用document()
功能,您必须通过将XsltSettings
对象传递到Load
功能并启用EnableDocumentFunction
来启用它。