Как заставить функцию расширения XSLT Javascript возвращать набор узлов?

Есть ли простой способ заставить функцию расширения в XSLT 1.0, написанную на javascript, возвращать набор узлов?
Я мог бы создать для этого новый класс java, но я бы предпочел просто поместить некоторый код в сам скрипт.
Когда это можно сделать на другом языке сценариев, поддерживаемом всеми или большинством XSLT-процессоров (сценарий VB? Groovy? C#?), тогда это, конечно, тоже нормально.

У меня есть следующий простой скрипт:

<msxsl:script language="JScript" implements-prefix="custom">
    function xml (input) {
        var x = input.split(";");
        return x.toString();
    }
</msxsl:script>

который возвращает строку и, следовательно, не вызывает проблем с вызовом функции в выражениях Xpath.
Что я хотел бы получить, так это результат набора узлов. Но когда я меняю свой сценарий на

<msxsl:script language="JScript" implements-prefix="custom">
    function xml (input) {
        var x = input.split(";");
        return x;
    }
</msxsl:script>

затем вызов функции дает ошибку, потому что массив не преобразуется автоматически в набор узлов.

Я просмотрел arrays-with-java-xslt-extensions, но это больше похоже на строку создания нового класса для этого, чего я пока хочу избежать.

Итак, какие операторы следует добавить в сценарий, чтобы преобразовать массив в набор узлов, что позволит использовать вызов функции в выражениях Xpath?


person Maestro13    schedule 19.04.2012    source источник
comment
Похоже, вы хотите превратить массив строк (результат вызова foo.split(";")) в набор узлов, что не имеет особого смысла.   -  person Dagg Nabbit    schedule 19.04.2012
comment
stackoverflow.com/questions/152822/   -  person erikxiv    schedule 19.04.2012


Ответы (2)


Вот пример, который должен работать с MSXML 6, если он запущен в режим, позволяющий скрипту в XSLT реализовывать функции расширения. Код таблицы стилей выглядит следующим образом:

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

  <xsl:output method="html" version="5.0"/>

  <ms:script language="JScript" implements-prefix="my">
  <![CDATA[
  function tokenize (input) {
    var doc = new ActiveXObject('Msxml2.DOMDocument.6.0');
    var fragment = doc.createDocumentFragment();
    var tokens = input.split(';');
    for (var i = 0, l = tokens.length; i < l; i++)
    {
      var item = doc.createElement('item');
      item.text = tokens[i];
      fragment.appendChild(item);
    }
    return fragment.selectNodes('item');
  }
  ]]>
  </ms:script>

  <xsl:template match="/">
    <html>
      <head>
        <title>Example</title>
      </head>
      <body>
        <h1>Example</h1>
        <ul>
          <xsl:apply-templates select="my:tokenize('Kibology;for;all')"/>
        </ul>
      </body>
    </html>
   </xsl:template>

   <xsl:template match="item">
     <li>
       <xsl:value-of select="."/>
     </li>
   </xsl:template>

</xsl:stylesheet>
person Martin Honnen    schedule 19.04.2012

Если вы хотите, чтобы возвращались узлы, вам придется создавать узлы самостоятельно, используя интерфейсы DOM. Я подозреваю (по памяти), что если вы вернете DOM NodeList из своей функции javascript, он будет обработан вызывающим кодом XPath как набор узлов XPath, хотя вам придется тщательно проверить спецификацию, чтобы узнать, как дублируются узлы и порядок документов обрабатываются.

Любые вопросы о расширениях XSLT java или javascript должны указывать, о каких продуктах вы говорите, потому что здесь нет стандартов.

person Michael Kay    schedule 19.04.2012
comment
Я хочу включить его в XSLT-процессор MSXML 6.0. Я надеюсь, что это позволит вам предоставить полный пример кода для прилагаемого простого скрипта :-). - person Maestro13; 19.04.2012
comment
Нет, извините, не будет. Мои познания в продуктах Microsoft действительно сильно устарели. - person Michael Kay; 21.04.2012
comment
Нет проблем, Майкл, Мартин уже предоставил его - еще раз спасибо за подсказку ему и мне, где искать решение. - person Maestro13; 21.04.2012