2

有没有一种简单的方法可以让用 javascript 编写的 XSLT 1.0 中的扩展函数返回一个节点集?
我可以为此创建一个新的 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 表达式中使用函数调用?

4

2 回答 2

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>
于 2012-04-19T10:06:12.990 回答
1

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

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

于 2012-04-19T08:27:01.050 回答