Domanda

io sono solo in fase di aggiornamento di un applicazione ASP.Net 1.1 fino a Net 3.5 e uno dei cambiamenti che ho fatto è quello di utilizzare XslCompiledTransform piuttosto che XslTransform. Stavo correndo attraverso alcuni XSLT di prova per garantire tutto andava bene quando ho trovato un XSLT che non è riuscita con il nuovo metodo.

Dopo un po 'di indagini ho scoperto che il XSLT ha avuto un enorme xsl: choose dichiarazione con 435 condizioni, esempio riportato di seguito: -

<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>

.... abbreviato per il bene della sanità mentale ......

<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>

Nel commentare la xsl sopra:. Scegliere permette la trasformazione di lavoro comunque lasciarlo in è attualmente infrangono il mio IIS pool di applicazioni e l'unica soluzione è quella di riavviare il pool di app

Mi rendo conto che una condizione di 435 scegliere affermazione non è una grande idea per una serie di motivi (ho ereditato questo codice si prega di non tenerlo contro di me) e sto andando a guardare a risolvere questo particolare problema in un altro modo però mi interessa il motivo per cui questo ha funzionato in precedenza utilizzando XslTransform, ma non lo fa con la XslCompiledTransform. C'è qualcosa in particolare che ho bisogno di guardare fuori per o è freakishly grande scegliere dichiarazione appena un una tantum.

È stato utile?

Soluzione

Non so il motivo di questo comportamento, ma si potrebbe aggirare il problema utilizzando una tabella di ricerca e la funzione 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>

Si noti che la funzione document() è disabilitata di default, è necessario attivarlo passando un oggetto XsltSettings alla funzione Load con EnableDocumentFunction on.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top