从 XSLT for-each 将节点作为参数传递到 msxsl:script javascript 函数中不起作用
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 文档必须具有顶级元素。” Visual Studio 2017 在我的 VB 程序中使用 MSXML2.DOMDocument60.transformNodeToObject API.
请注意,我不能使用任何在线 XSL 解析器,因为它们默认禁用脚本功能。
对此有什么想法吗?
点赞!
应该是user:getValue(., 'TEST_ATTRIBUTE_1')
,把行元素节点传给函数; this
在 XSLT/XPath 中没有意义,仅在 Java 或 Java 脚本或 C# 中可能。
但是,您传入的节点不会作为单个 DOM 节点反映到扩展脚本中,您可能会得到一个 DOM 选择列表并需要例如function getValue(selection, attributeName) { return selection[0].getAttribute(attributeName); }
以访问该选择中的第一个(在本例中为单个)项目。
我正在使用 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 文档必须具有顶级元素。” Visual Studio 2017 在我的 VB 程序中使用 MSXML2.DOMDocument60.transformNodeToObject API.
请注意,我不能使用任何在线 XSL 解析器,因为它们默认禁用脚本功能。
对此有什么想法吗?
点赞!
应该是user:getValue(., 'TEST_ATTRIBUTE_1')
,把行元素节点传给函数; this
在 XSLT/XPath 中没有意义,仅在 Java 或 Java 脚本或 C# 中可能。
但是,您传入的节点不会作为单个 DOM 节点反映到扩展脚本中,您可能会得到一个 DOM 选择列表并需要例如function getValue(selection, attributeName) { return selection[0].getAttribute(attributeName); }
以访问该选择中的第一个(在本例中为单个)项目。