1

我只是在将 ASP.Net 1.1 应用程序升级到 .Net 3.5 的过程中,我所做的更改之一是使用 XslCompiledTransform 而不是 XslTransform。当我发现使用新方法失败的 XSLT 时,我正在运行一些测试 XSLT 以确保一切正常。

经过一番调查,我发现 XSLT 有一个带有 435 个条件的巨大 xsl:choose 语句,示例如下:-

<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 感兴趣。有什么特别需要我注意的吗,或者这个非常大的选择声明只是一个选项。

4

1 回答 1

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带有EnableDocumentFunctionon 的功能来启用它。

于 2010-05-25T17:24:49.467 回答