Xpoint
   [напомнить пароль]

Связь с <select> и <xsl:template>

Метки: [без меток]
2007-08-10 08:59:54 [обр] walek[досье]

Добрый день друзья!

У меня есть небольшая концепция.
Имею xml файл с

<issueList>
 <issue intName="D07142" dateout="10.08.2007">142</issue>
 <issue intName="D07141" dateout="09.08.2007">141</issue>
 <issue intName="D07140" dateout="08.08.2007">140</issue>
<issueList>

Имею шаблон вывода:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:template match="issueList">
<table border="1">
    <tr>
    <td>
    <xsl:for-each select="issue">
        <xsl:call-template name="aug" />
    </xsl:for-each>
    </td>
    <td>
    </tr>
</table>
</xsl:template>

<xsl:template name="aug">
<xsl:choose>
   <xsl:when test="substring(@dateout, 4, 2)=08">
      <xsl:value-of select="@dateout" /> - <a href="/Athenaeum/Cdaily/Komm.asp?IssID={@intName}"><xsl:value-of select="." /></a><BR />
   </xsl:when>
   </xsl:choose>
</xsl:template>
</xsl:stylesheet>

Этот шаблон я привел к одному месяцу, августу, всего их 12, нет надобности приводить все ...

Хорошо, в asp файле я делаю:

<%
Dim sPath
Dim srcTree, xsltTree

'sPath = "d:\InetPub\WWWROOT\Info\Service\Weather\"
sPath = Server.MapPath("list.xml")
Set srcTree = CreateObject("Msxml2.DOMDocument")
srcTree.async=false
' // You can substitute other XML file names here.
srcTree.load(sPath) 

Set xsltTree = CreateObject("Msxml2.DOMDocument")
xsltTree.async = false
'   // You can substitute other XSLT file names here.
sPath = Server.MapPath("list.xsl")
xsltTree.load(sPath)


Response.Write(srcTree.transformNode(xsltTree))
%>

Все работает, все отлично.
Но, я хочу пойти дальше и сделать выбор месяца через тег <SELECT>
т.е.
<select name="months">
<option value="aug">
.....
</select>

Возможно ли реализовать такое, чтобы при выборе <option value="aug"> загружался шаблон <xsl:template name="aug"> ?
Т.е. при выборе месяца август, загружалась таблица с данными шаблона <xsl:template name="aug">.
Я так понимаю, это нужно реализовывать через JavaScript?

Кто-то может посдказать, хотя бы направление как решить эту задачу?
Спасибо.
Надеюсь объяснил понятно :-)

спустя 5 часов [обр] GRAy(64/259)[досье]

Вот вы не ленивый ;) заводить 12 шаблонов (судя по всему отличающихся только номером месяца) на каждый месяц. Я бы сделал так:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:param name="monthnum" />
<xsl:key name="allmonths" match="issueList/issue" use="substring(@dateout, 4, 2)" />

<xsl:template match="issueList">
  <xsl:if test="string-length($monthnum)!=0">
    <table border="1">
      <xsl:apply-templates select="issue[generate-id(.) = generate-id(key('allmonths',$monthnum))]" mode="group" />
    </table>
  </xsl:if>
<!-- а это на случай если нам параметр не передали - покажем все месяца -->
  <xsl:if test="string-length($monthnum)=0">
    <table border="1">
      <xsl:apply-templates select="issue[generate-id(.) = generate-id(key('allmonths',substring(@dateout, 4, 2)))]" mode="group" />
    </table>
  </xsl:if>
</xsl:template>

<xsl:template match="issue" mode="group">
  <tr>
    <td>
      <xsl:apply-templates select="key('allmonths',substring(current()/@dateout, 4, 2))" />
    </td>
  </tr>
</xsl:template>

<xsl:template match="issue">
   <xsl:value-of select="@dateout" /> - <a href="/Athenaeum/Cdaily/Komm.asp?IssID={@intName}"><xsl:value-of select="." /></a><BR />
</xsl:template>

</xsl:stylesheet>

Теперь преобразование выдаст вам список в зависимости от переданного параметра "monthnum" - т.е. от номера месяца. Чтобы реализовать переключение через select есть несколько путей:

  1. Передавать на клиент полный набор данных(xml) и xsl и там выполнять преобразование в зависимости от выбранного пункта в select`е.

Сценарий примерно следюущий:
  - на полученной пользователем странице лежит javascript
  - после загрузки страницы он делает два запроса на сервер - за полным набором данных и за xsl.
  - после получения выполняется трансформация (на клиенте) и в страницу вставляется её результат. В xsl можно передать параметр и таким образом оставить только issue с нужным месяцем.

  1. Передавать на клиент только xsl. Запрос за данными делать уже после выбора пользователем какого-то месяца. Над полученным результатом выполнять трансформацию (на клиенте) и результат вставлять в страницу. В таком варианте ездит меньше данных и не загружается избыточной информацией машина пользователя.
  2. Передавать на клиент только javascript который умеет спрашивать у сервера результат трансформации передав ему выбранный пользователем в данный момент месяц и вставлять полученный результат в страницу. В таком случае вы не зависите от поддержки клиентской машиной xml и xsl.

Выбор за вами. В зависимости от - будет отличаться javascript.

спустя 2 дня 22 часа [обр] walek[досье]

GRAy, спасибо. Ваш код понятен.
Да, огород конечно я нагородил порядочный :о)

А если мне поступить вот так:

<xsl:template match="issueList">
   <BR />
   <BR />

   <table border="1">
      <tr>
         <td></td>
      </tr>
      <xsl:apply-templates select="issue[substring(@dateout, 4, 2)=01]" />
   </table>
</xsl:template>

Вываливаются значения за январь. Т.е. нужно каким-то образом сделать это значение зависимым от значения value тега <selection>.
Сильно не бейте, но возможно я не на правильном пути. Но я не могу понять как их можно связать, Может кто-нить сможет хотя бы чут-чуть показать, как это реализуется, голову уже сломал, не могу понять.
Спасибо.

спустя 4 часа 39 минут [обр] GRAy(64/259)[досье]

walek[досье]

Ваш код понятен.

если бы был понятен, вопроса бы не возникло. Обратите внимание на <xsl:param name="monthnum" /> и на <xsl:apply-templates select="issue[generate-id(.) = generate-id(key('allmonths',$monthnum))]" mode="group" /> (в последнем случае конкретно на $monthnum). Передать параметр в преобразование можно извне, как именно - зависит от xsl процессора которым вы пользуетесь.

спустя 1 час 4 минуты [обр] walek[досье]

GRAy, спасибо что уделяете мне свое время.
XSL процессор - MSXML 4.0.

И можно еще паралелльный вопрос по функции generate-id()
В приведенном вашем коде получаетс, что вы выводите сначала элементы августа, а потом уже все остальные, в порядке убывания.
Признаюсь честно, с трудом понимаю как работает функция generate-id(). Пытался из вашего примера реализовать вывод к примеру августа месяца (автоматически, т.е. не указывая так сказать вручную, как это я приводил в предыдущем своем примере: вот таким образом <xsl:apply-templates select="issue[substring(@dateout, 4, 2)=08]" />
), но не получилось. Разъясните пожалуйста, если вас не затруднит.

спустя 15 часов [обр] walek[досье]
GRAy, перечитал группировку Мюнха, стало ясно.
Теперь до меня дошло, что вы имели в виду.
спустя 2 часа 52 минуты [обр] walek[досье]

Я так понимаю в общем виде должно выглядеть так?

<msxsl:script implements-prefix="user"><![CDATA[ 

    function data() 
    { 
//Тело функции 

    return sdata; 
    } 

]]></msxsl:script>

Кто-нибудь сталкивался с подобным?
Спасибо.

спустя 5 часов [обр] GRAy(64/259)[досье]
спустя 20 часов [обр] walek[досье]

GRAy, спасибо за наводку. Подскажите пожалуйста, я делаю следующим образом:

<script Language="JavaScript">
var source = null;
var style = null;
var objTransformer = null;

function init() {
   source = new ActiveXObject("MSXML2.DOMDocument.4.0");
   source.async = false;
   source.load("/Athenaeum/Cdaily/2006/list.xml");
   style = new ActiveXObject("MSXML2.FreeThreadedDOMDocument.4.0");
   style.async = false;
   source.load("/Athenaeum/Cdaily/2006/list.xsl");

   objTransformer = new ActiveXObject("MSXML2.XSLTemplate");
   objTransformer.stylesheet = style.documentElement;
   refresh();
}

function refresh(sel) {
   var xlsproc = objTransformer.createProcessor();
   xlsproc.input = source;
   xlsproc.addParameter("monthnum", sel, "");
   xlsproc.transform();
}
</script>

<a href="JavaScript:refresh('01')">ссылка</a>
Но ругается: "Требуемое свойство не имеет допустимого значения". Что я сделал не так?
Спасибо.

спустя 1 час 16 минут [обр] GRAy(64/259)[досье]
walek[досье] Создавайте другую тему - к первоначальному вопросу это уже отношения не имеет. Создавать лучше в разделе про javascript и не забудьте привести там ссылку на этот топик.
спустя 18 минут [обр] walek[досье]
GRAy, хорошо, я так и подумал, что это другая тема, хорошо, что поправили %).
Powered by POEM™ Engine Copyright © 2002-2005