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

2

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

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

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

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

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

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

Я посмотрел на Массивы-с-Java-XSLT-расширений но это больше связано с созданием для этого нового класса, которого я пока не хочу.

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

Звучит так, будто вы хотите превратить массив строк (результат вызоваfoo.split(";")) в набор узлов, который не имеет особого смысла. Dagg Nabbit

Ваш Ответ

2   ответа
1

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

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

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

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

<xsl:stylesheet
  xmlns:xsl="http://www..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>
Это здорово, Мартин. Я проверил это, и оно отлично работает! Maestro13

Похожие вопросы