powered by simpleCommunicator - 2.0.49     © 2025 Programmizd 02
Форумы / XML, XSL, XPath, XQuery [игнор отключен] [закрыт для гостей] / Почему нельзя расширять функции xsl самим же xsl?
4 сообщений из 4, страница 1 из 1
Почему нельзя расширять функции xsl самим же xsl?
    #38941551
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Синтаксис же позволяет.

Мысль появилась в связи с копипастой такого кода:
Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
        <tr>
          <td>Является филиалом</td>
          <td>
            <xsl:choose>
              <xsl:when test="IsFilial">Да</xsl:when>
              <xsl:otherwise>Нет</xsl:otherwise>
            </xsl:choose>
          </td>
        </tr>
        <tr>
          <td>Есть военная кафедра</td>
          <td>
            <xsl:choose>
              <xsl:when test="HasMilitaryDepartment">Да</xsl:when>
              <xsl:otherwise>Нет</xsl:otherwise>
            </xsl:choose>
          </td>
        </tr>

Слишком много повторяющихся букв. Так было бы лучше:

Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
        <tr>
          <td>Является филиалом</td>
          <td><xsl:value-of select="iif(IsFilial,'Да','Нет')"/></td>
        </tr>
        <tr>
          <td>Есть военная кафедра</td>
          <td><xsl:value-of select="iif(HasMilitaryDepartment,'Да','Нет')"/></td>
        </tr>

  <xsl:template name="iif">
    <xsl:param name="condition"/>
    <xsl:param name="true"/>
    <xsl:param name="false"/>
    <xsl:choose>
      <xsl:when test="$condition"><xsl:value-of select="$true"/></xsl:when>
      <xsl:otherwise><xsl:value-of select="$false"/></xsl:otherwise>
    </xsl:choose>
  </xsl:template>



Но так парсеры, сцуко, не умеют, хотя объективных причин так не сделать нет. Тут не надо даже с неймспейсами возиться, не то что синтаксис расширять.
И 9 из 10 подобных костылей http://geekswithblogs.net/lszk/archive/2011/08/24/using-custom-functions-in-xsl.aspx отпали бы за ненадобностью.
...
Рейтинг: 0 / 0
Почему нельзя расширять функции xsl самим же xsl?
    #38941609
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AntonariyНо так парсеры, сцуко, не умеютУмеют :)
Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  version="1.0"
  xmlns:func="http://exslt.org/functions">

  <func:function name="iif">
    <xsl:param name="condition"/>
    <xsl:param name="true"/>
    <xsl:param name="false"/>
    <func:result>
      <xsl:choose>
        <xsl:when test="$condition"><xsl:value-of select="$true"/></xsl:when>
        <xsl:otherwise><xsl:value-of select="$false"/></xsl:otherwise>
      </xsl:choose>
    </func:result>
  </func:function>
</xsl:stylesheet>

детали в гугле по запросу exslt
...
Рейтинг: 0 / 0
Почему нельзя расширять функции xsl самим же xsl?
    #38941613
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
К слову сказать, сам использую такой кроссплатформенный код
Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  version="1.0"
  xmlns:msxsl="urn:schemas-microsoft-com:xslt"
  xmlns:func="http://exslt.org/functions"
  xmlns:common="http://exslt.org/common">

  <func:function name="msxsl:node-set">
    <xsl:param name="ANodes"/>
    <func:result select="common:node-set($ANodes)"/>
  </func:function>
</xsl:stylesheet>


Теперь вызов
Код: xml
1.
<xsl:apply-templates select="msxsl:node-set($nodes)"/>

работает на любом парсере
...
Рейтинг: 0 / 0
Почему нельзя расширять функции xsl самим же xsl?
    #38941618
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну и для MS
Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  version="1.0"
  xmlns:msxsl="urn:schemas-microsoft-com:xslt"
  xmlns:script="http://www.mysite.com.ua/script">

  <msxsl:script language="JavaScript" implements-prefix="script">
    function Log10(AVal){
      try {
        return Math.log(AVal)/Math.LN10;
      } catch (e) {
        return 0
      }
    }
    
    function Pow(ABase, AExp){
      try {
        return Math.pow(ABase, AExp);
      } catch (e) {
        return 0
      }
    }
    
    function now(){
      return dateTimeToStr(new Date(), 'yyyy-mm-ddThh:nn:ss');
    }
  </msxsl:script>
</xsl:stylesheet>

Use
Код: xml
1.
<xsl:value-of select="script:Log10(100)"/>
...
Рейтинг: 0 / 0
4 сообщений из 4, страница 1 из 1
Форумы / XML, XSL, XPath, XQuery [игнор отключен] [закрыт для гостей] / Почему нельзя расширять функции xsl самим же xsl?
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]