определить доступность функции node-set() в реализации xslt сервера icecast

Icecast содержит реализацию XSLT на основе libxslt из xmlsoft.

Я хочу знать, поддерживает ли он функцию node-set(), предпочтительно таким образом, который работает и для других веб-сред:

К сожалению, XSLT-процессор в icecast доступен через Интернет только через веб-интерфейс процесса icecast (поэтому никакие xsltproc в командной строке). Что еще хуже: журналирование ошибок XSLT ограничено (когда вы делаете что-то неправильно, процесс icecast часто просто умирает).

Я использую icecast 2.3.2, так как это последняя сборка на базе Windows (есть пока нет сборки 2.3.3 для Windows), в которой libxslt.dll датирована 2008 годом. нет номера версии в DLL, лучшее, что я могу предоставить, это (см. код XSLT внизу):

Version:    1.0
Vendor:     libxslt
Vendor URL: http://xmlsoft.org/XSLT/

Я попытался запустить определение набора узлов, упомянутое в блог Дэвида Карлайла в статье Функция набора узлов EXSLT, на которую указывает "Как использовать функцию набора узлов независимо от платформы?".

Из вывода я думаю, что это не удается:

icemaster@localhost972990localhost00EarthIcecast 2.3.2Sun, 23 Jun 2013 20:02:19 W. Europe Daylight Time202200ice-samplerate=44100;ice-bitrate=64;ice-channels=264StationGenre6424410000http://localhost:8000.....

Что лучше всего узнать через XSL-файл в веб-интерфейсе?

Скрипт версии:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">
  <xsl:output method="text" encoding="UTF-8" />
  <xsl:template match="/">
Version:    <xsl:value-of select="system-property('xsl:version')" />
Vendor:     <xsl:value-of select="system-property('xsl:vendor')" />
Vendor URL: <xsl:value-of select="system-property('xsl:vendor-url')" />
  </xsl:template>
</xsl:stylesheet>

сценарий набора узлов, который я пробовал:

<xsl:stylesheet
  version="1.0"
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  xmlns:exslt="http://exslt.org/common"
  xmlns:msxsl="urn:schemas-microsoft-com:xslt"
  exclude-result-prefixes="exslt msxsl">

<xsl:output
  omit-xml-declaration="no"
  method="html"
  indent="yes"
  encoding="UTF-8" />

<msxsl:script language="JScript" implements-prefix="exslt">
 this['node-set'] =  function (x) {
  return x;
  }
</msxsl:script>

<xsl:variable name="x">
  <y/>
</xsl:variable>

<xsl:template match="x">
  <html>
    <head><title>test exslt node set</title></head>
    <body>
      <xsl:apply-templates select="exslt:node-set($x)/*"/>
    </body>
  </html>
</xsl:template>

<xsl:template match="y">
  <p>node set!</p>
</xsl:template>

</xsl:stylesheet>

person Jeroen Wiert Pluimers    schedule 23.06.2013    source источник
comment
Если бы это был XSLT 3, у вас был бы такой вариант: w3.org /TR/xslt-30/#функция-доступна   -  person caduceus    schedule 28.08.2018


Ответы (1)


Короткий ответ

libxslt в icecast поддерживает xt:node-set().
Ниже она реализована в xsltFunctionNodeSet().

Общий ответ

Я создал решение на основе библиографии CSTUG XSLT, используя системное свойство функции.

Пожалуйста, прокомментируйте, если это действительно правильный способ сделать это.

Код CSTUG обрабатывает следующие функции node-set():

  • exslt: набор узлов ()
  • msxml: набор узлов ()
  • ксаланк: набор узлов ()

Я также добавил поддержку для них:

  • xt: набор узлов ()
  • saxon6: набор узлов ()

Вывод из Icecast:

Version:    1.0
Vendor:     libxslt
Vendor URL: http://xmlsoft.org/XSLT/
node-set(): xt:node-set()

XSLT используется:

<xsl:stylesheet
  version="1.0"
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  xmlns:exslt="http://exslt.org/common"
  xmlns:msxml="urn:schemas-microsoft-com:xslt"
  xmlns:xalanc="http://xml.apache.org/xalanc"
  xmlns:xt="http://www.jclark.com/xt"
  xmlns:saxon6="http://icl.com/saxon"
  extension-element-prefixes="exslt msxml xalanc xt saxon6"
  exclude-result-prefixes="exslt msxml xalanc xt saxon6"
  >

  <xsl:output method="text" encoding="UTF-8" />
  <xsl:template match="/">
    <xsl:text>
Version:    </xsl:text>
    <xsl:value-of select="system-property('xsl:version')" />
    <xsl:text>
Vendor:     </xsl:text>
    <xsl:value-of select="system-property('xsl:vendor')" />
    <xsl:text>
Vendor URL: </xsl:text>
    <xsl:value-of select="system-property('xsl:vendor-url')" />
<!--
Prefixes used for node-set()
exslt: EXSLT aware processors (Saxon, xsltproc, Xalan-J, jd.xslt, 4XSLT)
msxml: MSXML
xalanc: Xalan-C, Xalan-J 2.6.x
xt: XT, libxslt
saxon6: Saxon 6
-->
    <xsl:text>
node-set(): </xsl:text>
    <xsl:choose>
      <xsl:when test="function-available('exslt:node-set')">
        <xsl:text>exslt:node-set()</xsl:text>
      </xsl:when>
      <xsl:when test="function-available('msxml:node-set')">
        <xsl:text>msxml:node-set()</xsl:text>
      </xsl:when>
      <xsl:when test="function-available('xalanc:nodeset')">
        <xsl:text>xalanc:nodeset()</xsl:text>
      </xsl:when>
      <xsl:when test="function-available('xt:node-set')">
        <xsl:text>xt:node-set()</xsl:text>
      </xsl:when>
      <xsl:when test="function-available('saxon6:node-set')">
        <xsl:text>saxon6:node-set()</xsl:text>
      </xsl:when>
      <xsl:otherwise>
        <xsl:text>EXSLT:node-set not found!</xsl:text>
      </xsl:otherwise>
    </xsl:choose>
  </xsl:template>
</xsl:stylesheet>
person Jeroen Wiert Pluimers    schedule 23.06.2013