当前位置: 首页 > 知识库问答 >
问题:

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

郭永怡
2023-03-14

有没有一种简单的方法可以让用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>

然后调用该函数会出现错误,因为数组不会自动转换为节点集。

我研究了带有java xslt扩展的数组,但这更多是为了创建一个新的类,我现在希望避免这样做。

那么应该向脚本中添加哪些语句才能将数组转换为节点集,从而允许在Xpath表达式中使用函数调用?

共有2个答案

谢旭
2023-03-14

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

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

阎裕
2023-03-14

这是一个可以使用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>
 类似资料:
  • 说明 本部分说明如何在现有的机器中添加一个新的计算节点。添加节点之前,OpenShift 共有四个节点,1 个 master,1 个 infra,2 个 nodes,如下命令所示: # oc get nodes NAME STATUS ROLES AGE VERSION infra.example.com Ready infr

  • Dart 2.6引入了一个新的语言特性,叫做“静态扩展成员”。 但是,我不太明白如何使用它。 我希望轻松获取或的,即使用而不是: 我试图执行以下操作,但这是一个语法错误:

  • 在针对PHPCMS V9做二次开发的时候,您可以自定义一些全局函数且不影响以后官方升级 您自定义的文件请放置于该文件中 phpcms\libs\functions\extention.func.php或者以.func.php格式命名,放置于如下目录中 phpcms\libs\functions\autoload

  • 问题内容: 我想将一个字符串添加到列表中: 但它打印。这是为什么? 问题答案: 该函数是就地函数,即它将对原始列表本身进行更改。来自文档 通过添加 给定 列表中的所有项目来扩展列表;等效于a [len(a):] =L。 因此,您无需将其重新分配回列表变量。 你可以做 然后当您打印时 更好的方法 如下所述使用是更好的方法。

  • 我想为kubernetes节点添加扩展资源,我可以通过curl命令来完成:https://kubernetes.io/docs/tasks/administer-cluster/extended-resource-node/,即: 然后,我可以创建一个需要example.com/dongle资源的pod。 但是,如何使用fabric8 Java API来做到这一点呢? 我用所有节点相关的API在我

  • 我有一个数据库事务函数,可以进行多个查询,并以[resultQuery1、resultQuery2等格式返回每个查询的结果]。我不确定如何为这个泛型函数提供预期的返回类型。 游戏场 示例: 错误: 类型“(字符串|{id:number;})[]不可分配给类型“T”(字符串|{id:number;})[]”可分配给类型为“T”的约束,但“T”可以用约束“any[]”的不同子类型实例化。