如何使 XSLT Javascript 扩展函数返回节点集

How can make an XSLT Javascript extension function return a node-set?

本文关键字:返回 节点 点集 函数 扩展 何使 XSLT Javascript      更新时间:2023-09-26

有没有一种简单的方法可以让用javascript编写的XSLT 1.0中的扩展函数返回节点集?
我可以为此创建一个新的 java 类,但我宁愿只在脚本本身中放置一些代码。
何时可以使用所有或大多数 XSLT 处理器支持的另一种脚本语言(VB 脚本?槽的?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 表达式中使用函数调用?

下面是一个示例,只要在允许 XSLT 中的脚本实现扩展函数的模式下运行,它就应该适用于 MSXML 6。样式表代码如下:

<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>

如果你想返回节点,你必须使用 DOM 接口自己创建节点。我怀疑(从内存中)如果您从javascript函数返回DOM NodeList,则调用XPath代码将其视为XPath节点集 - 尽管您必须仔细检查规范以获取有关如何处理重复节点和文档顺序的详细信息。

任何关于 XSLT java 或 javascript 扩展的问题都需要说明您正在谈论的产品,因为这里没有标准。