Как передать параметр из ASP в XSL? - PullRequest
1 голос
/ 03 декабря 2009

Я пишу простую страницу asp, чтобы показать командное рота на основе некоторого XML. Вот XML:

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

Я хочу, чтобы на моей странице asp отображались подробности сегодняшнего ротации и, возможно, подробности на следующие пару дней. Позже я хотел бы иметь возможность установить день в будущем, чтобы увидеть, кто работает вокруг, тогда я хочу иметь возможность передавать дату ГГГГММДД из ASP в XSL, который обрабатывает XML.

Вот XSL, который у меня есть, просто выделив жестко закодированную «текущую» дату на данный момент:

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

и вот ASP, еще не передавший никаких параметров:

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

Итак, как мне а) передать параметр в XSL и б) выбрать этот параметр и использовать его в XSL?

Спасибо за любые советы.

Ответы [ 2 ]

6 голосов
/ 03 декабря 2009

В вашем xsl создайте xsl:parameter вверху перед всеми вашими шаблонами.

<xsl:parameter name="showdate"/>

Теперь вы можете рассматривать это как переменную: -

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

Для передачи параметра необходимо использовать объект процессора XSL, который позволяет добавить параметр перед обработкой. В свою очередь вы получаете процессор из экземпляра объекта шаблона XSL. В свою очередь, вам необходим FreeThreadedDOMDocument, чтобы назначить параметру таблицы стилей шаблоны. Следовательно, код более сложный: -

 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

Соблазнительно назначить объект Response выходному параметру процессора, который работает достаточно хорошо и более эффективно. Однако недавние пакеты обновления MSXML сделали такую ​​технику несовместимой с реализацией ASP IStream в объекте Response.

Так вот, как вы делаете это официально, как я обычно делаю, это вставляю какой-то произвольный атрибут в корневой узел исходного XML-файла и затем использую переменную: -

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

Теперь вы можете использовать переменную вместо параметра внутри вашего основного шаблона: -

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

В этом подходе вы можете использовать уже используемый код преобразования, который намного проще.

1 голос
/ 03 декабря 2009

Вы должны объявить свой параметр следующим образом:

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

И передайте это так

'// 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()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...