2009-12-03 4 views
1

J'écris une page asp simple pour montrer une rotation d'équipe basée sur du XML. Voici le XML:Comment passer un paramètre d'ASP à XSL?

<rota> 
<shift date="20091201" primary="Chan" secondary="John" notes="notes"></shift> 
<shift date="20091202" primary="Mike" secondary="Alex" notes="notes"></shift> 
<shift date="20091203" primary="Ross" secondary="Mike" notes="notes"></shift> 
<shift date="20091204" primary="Neil" secondary="Ross" notes="notes"></shift> 
</rota> 

Je veux que ma page asp pour montrer les détails rota d'aujourd'hui et peut-être les détails pour les deux prochains jours. Puisque plus tard je voudrais être en mesure de définir une journée dans le futur pour voir qui travaille autour, alors je veux être en mesure de passer une date YYYYMMDD de l'ASP au XSL qui traite le XML.

Voici le XSL je jusqu'à présent, tout en soulignant la hardcoded la date 'actuelle' pour l'instant:

<xsl:template match="rota"> 
    <html> 
    <head> 
     <title>Team Rota</title> 
     <LINK type="text/css" rel="stylesheet" href="http://www.csfb.net/homepage/global/scripts/csfb_intranet.css"/> 
    </head> 
    <body> 
    <table border="1"> 
    <TR><TH>Date</TH><TH>Primary</TH><TH>Secondary</TH><TH>Notes</TH></TR> 
    <xsl:for-each select="shift"> 
     <tr> 
      <xsl:choose> 
       <xsl:when test="@date = '20091203'"> 
        <td bgcolor='FFF0F0'><xsl:value-of select="@date"/></td> 
       </xsl:when> 
       <xsl:otherwise> 
        <td><xsl:value-of select="@date"/></td> 
       </xsl:otherwise> 
      </xsl:choose> 
      <td><xsl:value-of select="@primary"/></td> 
      <td><xsl:value-of select="@secondary"/></td> 
      <td><xsl:value-of select="@notes"/></td> 
     </tr>  
    </xsl:for-each> 
    </table> 
    </body> 
    </html> 
</xsl:template> 

et est ici l'ASP, ne passe pas encore de paramètres:

''// Load the XML 
sourcefile = "rota.xml" 
set source = Server.CreateObject("Microsoft.XMLDOM") 
source.async = false 
source.load(sourceFile) 

''// Load the XSL 
styleFile = Server.MapPath("rota.xsl") 
set style = Server.CreateObject("Microsoft.XMLDOM") 
style.async = false 
style.load(styleFile) 

htmltext = source.transformNode(style) 
Response.Write htmltext 

Comment puis-je a) passer un param Eter à la XSL et b) ramasser ce paramètre et l'utiliser dans le XSL?

Merci pour toute indication.

Répondre

6

En vous xsl créer un xsl:parameter en haut avant que tous vos modèles.

<xsl:parameter name="showdate"/> 

Vous pouvez maintenant traiter cela comme vous le feriez une variable: -

<xsl:when test="@date = $showdate"> 

Pour passer un paramètre que vous devez utiliser un objet processeur XSL qui vous permet d'ajouter le paramètre avant le traitement . À son tour, vous obtenez un processeur à partir d'une instance d'un objet modèle XSL. À son tour, vous avez besoin d'un document FreeThreadedDOMDocument à assigner au paramètre stylesheet stylesheet. D'où le code est plus complexe: -

Dim xsl : Set xsl = CreateObject("MSXML2.FreeThreadedDOMDocument.3.0") 
xsl.async = false 
xsl.load xslFile 

Dim xml : Set xml = CreateObject("MSXML2.DOMDocument.3.0") 
xml.async = false 
xml.load sourceFile 

Dim xslTemplate : Set xslTemplate = CreateObject("MSXML2.XSLTemplate.3.0") 
xslTemplate.stylesheet = xsl; 

Dim processor : Set processor = xslTemplate.createProcessor() 
processor.addParameter "showDate", "20091203" 
processor.input = source 
processor.transform() 

Response.Write processor.output 

Son tentant d'affecter l'objet de réponse au paramètre de sortie du processeur qui fonctionne très bien et est plus efficace. Toutefois, les Service Packs récents de MSXML ont rendu une telle technique incompatible avec l'implémentation d'IStream par ASP dans l'objet Response.

des thats Alors, comment vous le faites officiellement, comment je le fais est normalement d'injecter un attribut arbitraire sur le nœud racine de source XML puis utilisez une variable: -

xml.documentElement.setAttribute("_showDate", "20091203") 

Maintenant, vous pouvez utiliser une variable à la place d'un paramètre dans votre modèle principal: -

<xsl:template match="rota"> 
    <xsl:variable name="showdate" select="@_showDate" /> 
    <html> ... 
     <xsl:when test="@date = $showdate"> 

Dans cette approche, vous pouvez utiliser le code transformation que vous utilisez déjà ce qui est beaucoup plus simple.

+0

J'ai utilisé votre dernière suggestion et cela fonctionne un régal. Merci! – theaxe

1

Vous devez déclarer votre paramètre comme ceci:

<xsl:stylesheet ... > 
    <xsl:parameter name="your_parameter"/> 
    <xsl:template match="rota"> 
     $your_parameter = <xsl:value-of select="$your_parameter" /> 
    ... 

Et passer comme ça

'// Load the XSL 
styleFile = Server.MapPath("rota.xsl") 
set style = Server.CreateObject("MSXML2.FreeThreadedDOMDocument.3.0") 
style.async = false 
style.load(styleFile) 

Set template = Server.CreateObject("MSXML2.XSLTemplate.3.0") 
template.stylesheet = style 

Set processor = myTemplate.createProcessor() 
processor.addParameter "your_parameter", "value" 
processor.input = source 
processor.output = Response 
processor.transform() 
+1

Merci pour la réponse rapide.Maintenant, je reçois: "Le document de feuille de style XSL doit être libre de droits afin d'être utilisé avec l'objet XSLTemplate." – theaxe

+0

mis à jour, vérifiez-le –

Questions connexes