对于具有许多xsl:X条件的XSLT,XslCompiledTransform失败

时间:2010-05-25 15:22:46

标签: .net xslt xslcompiledtransform

我正处于将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。有什么特别需要注意的事情,或者这个特别大的选择陈述只是一次性的。

1 个答案:

答案 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来启用它。