1

私は ASP.Net 1.1 アプリケーションを .Net 3.5 にアップグレードする過程にあり、行った変更の 1 つは、XslTransform ではなく XslCompiledTransform を使用することです。新しいメソッドを使用して失敗した 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 条件の select ステートメントはさまざまな理由から (私はこのコードを継承したので、私に反抗しないでください) 良いアイデアではないことに気付きました。別の方法でこの特定の問題を解決することを考えていますが、これが以前は XslTransform を使用して機能していたのに、XslCompiledTransform では機能しなかった理由に興味があります。特に注意する必要があるものはありますか、それともこの非常に大きな choose ステートメントは 1 回限りのものですか。

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オブジェクトを on でLoad関数に渡して有効にする必要がありますEnableDocumentFunction

于 2010-05-25T17:24:49.467 に答える