怎样才能使一个XSLT JavaScript扩展功能返回一个节点集?(How can make an

2019-06-23 18:33发布

有一个简单的方法来在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>

然后调用函数给出一个错误,因为阵列不是自动转换为节点集合。

我看着阵列与- Java的XSLT的扩展 ,但是这更多在创造这个新的类,我希望避免现在的线。

那么,哪些语句应该被添加到脚本,以数组转换成节点集,允许在XPath表达式中使用的函数调用?

Answer 1:

下面是一个例子 ,应与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>


Answer 2:

如果你想返回的节点,你必须自己创建的节点,使用DOM接口。 我怀疑(从内存中),如果您从您的javascript函数返回一个DOM节点列表,将被调用的XPath代码为XPath节点集进行处理 - 但你必须仔细检查规范,详细了解如何重复的节点和文档顺序被处理。

有关XSLT java或有任何疑问,JavaScript扩展需要说些什么产品(第)你所谈论的,因为没有标准在这里。



文章来源: How can make an XSLT Javascript extension function return a node-set?