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

经过一番调查,我发现XSLT有一个巨大的XSL:选择具有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:选择允许转换可以正常工作,但是将其放入当前正在崩溃我的IIS应用程序池,唯一的解决方案是重新启动应用程序池。

我意识到435条件选择陈述不是一个好主意,原因有多种原因(我继承了此代码,请不要对我不利),我将以另一种方式看待解决这个特殊问题,但是我感兴趣的是为什么此之前使用XSLtransform进行了此操作,而不是与XSLCompileDtransform一起使用。我需要注意的是特别的东西,还是这个奇特的大型选择陈述只有一个。

有帮助吗?

解决方案

我不知道这种行为的原因,但是您可以使用查找表和 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 在。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top