繁体   English   中英

将节点作为参数在 msxsl:script javascript 函数中从 XSLT for-each 传递不起作用

[英]Passing node as parameter in msxsl:script javascript function from XSLT for-each doesn't work

我正在使用 MSXML6 并且我已将 AllowXsltScript 设置为 true 以便在我的 VB 程序中启用脚本的使用。

给定以下 XML 输入:

<xml>
    <data>
        <row TEST_ATTRIBUTE_1="test1a" TEST_ATTRIBUTE_2="test2a"/>
        <row TEST_ATTRIBUTE_1="test1b" TEST_ATTRIBUTE_2="test2b"/>
        <row TEST_ATTRIBUTE_1="test1c" TEST_ATTRIBUTE_2="test2c"/>
    </data>
</xml>

以下 XSL 无法按预期工作:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"  version = "1.0"
  xmlns:rs="urn:schemas-microsoft-com:rowset" xmlns:z="#RowsetSchema"
  xmlns:msxsl="urn:schemas-microsoft-com:xslt"
  xmlns:user="random">

  <msxsl:script language="javascript" implements-prefix="user" >
  <![CDATA[
  function getValue(node, attribute)
  {  
     var value;
     value = node.getAttribute(attribute);

     return value;
  }
 ]]>
  </msxsl:script>
  
  <xsl:template match="/">
    <xsl:apply-templates select="//data"/>
  </xsl:template>

  <xsl:template match="//data">
    <TBODY>
      <xsl:for-each select="row">
        <xsl:value-of select="user:getValue(this, 'TEST_ATTRIBUTE_1')"/>
      </xsl:for-each>
    </TBODY>
  </xsl:template>

</xsl:stylesheet>

问题似乎在于在 for-each 内部为节点传入“this”。 更确切地说,当它尝试执行node.getAttribute(attribute); 那是它失败的时候。

我得到的错误是“找不到与此错误代码关联的文本。XML 文档必须具有顶级元素。” 在使用 MSXML2.DOMDocument60.transformNodeToObject API 的 VB 程序中的 Visual Studio 2017 中。

请注意,我无法使用任何在线 XSL 解析器,因为它们默认禁用脚本功能。

对此有何想法?

欣赏它!

应该是user:getValue(., 'TEST_ATTRIBUTE_1') ,将行元素节点传递给函数; this在 XSLT/XPath 中没有意义,也许只有在 Java 或 JavaScript 或 C# 中才有意义。

但是,您传入的节点不会作为单个 DOM 节点反映到扩展脚本中,您可能会获得一个 DOM 选择列表并需要例如function getValue(selection, attributeName) { return selection[0].getAttribute(attributeName); } function getValue(selection, attributeName) { return selection[0].getAttribute(attributeName); }访问该选择第一个(在这种情况下单)项。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM