XslCompiledTransform терпит неудачу для XSLT со многими xsl: когда условия - PullRequest
1 голос
/ 25 мая 2010

Я только что обновил приложение ASP.Net 1.1 до .Net 3.5, и одно из изменений, которые я сделал, - это использование XslCompiledTransform, а не XslTransform. Я проверял некоторые тестовые XSLT, чтобы убедиться, что все было в порядке, когда я нашел XSLT, который не удался при использовании нового метода.

После небольшого исследования я обнаружил, что XSLT имел огромный оператор xsl: select с 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 Ответ

2 голосов
/ 25 мая 2010

Я не знаю причину этого поведения, но вы можете обойти эту проблему, используя таблицу поиска и функцию 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...