XslCompiledTransform перестал работать для XSLT со многими xsl:when условиями

Я нахожусь только в процессе обновления приложения ASP.Net 1.1 до.Net 3.5 и одного из изменений, которые я внес, должен использовать XslCompiledTransform, а не XslTransform. Я пробегал некоторый тест XSLTs, чтобы гарантировать, что все было хорошо, когда я нашел 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
задан colethecoder 25 May 2010 в 15:22
поделиться

1 ответ

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

2
ответ дан 3 September 2019 в 00:19
поделиться
Другие вопросы по тегам:

Похожие вопросы: