Javascript VisualStudio和IE之间的XSL/JScript行为差异

Javascript VisualStudio和IE之间的XSL/JScript行为差异,javascript,xml,internet-explorer,xslt,Javascript,Xml,Internet Explorer,Xslt,有人能告诉我为什么下面的XSL在IE9中很高兴地转换了下面的XML,但在所有版本的VisualStudio中相同的转换都失败了?如果我在IE 9中打开XML文件,它会被转换,输出结果与预期的一样,但是如果我在Visual Studio中尝试对XML文件进行相同的转换(使用工具栏上的“启动XSLT”按钮),我会得到一个JScript异常,表示行中预期的函数 var node = root.nextNode(); 解决方案似乎是将javascript函数改为执行以下操作: function tes

有人能告诉我为什么下面的XSL在IE9中很高兴地转换了下面的XML,但在所有版本的VisualStudio中相同的转换都失败了?如果我在IE 9中打开XML文件,它会被转换,输出结果与预期的一样,但是如果我在Visual Studio中尝试对XML文件进行相同的转换(使用工具栏上的“启动XSLT”按钮),我会得到一个JScript异常,表示行中预期的函数

var node = root.nextNode();
解决方案似乎是将javascript函数改为执行以下操作:

function test(root, attr)
{
  root.MoveNext();
  var node = root.Current;
  return node.Select("breakfast" + attr);
}
但是这会使IE中的XSLT转换失败!我好像赢不了

XSL:


目标XML:

<?xml version='1.0'?>
<?xml-stylesheet type="text/xsl" href="simple.xsl" ?>
<breakfast-menu>
  <food>
    <name>Belgian Waffles</name>
    <price>$5.95</price>
    <description>Two of our famous Belgian Waffles 
      with plenty of real maple syrup.</description>
    <calories>650</calories>
  </food>
  <food>
    <name>Homestyle Breakfast</name>
    <price>$6.95</price>
    <description>Two eggs, bacon or sausage, toast, 
      and our ever-popular hash browns.</description>
    <calories>950</calories>
  </food>
</breakfast-menu>

华夫饼
$5.95
我们两个著名的比利时华夫饼干
加了很多真正的枫糖浆。
650
家庭式早餐
$6.95
两个鸡蛋,熏肉或香肠,吐司,
还有我们最受欢迎的炸土豆条。
950

您可能会发现嵌入Visual Studio的浏览器不是IE9。它很可能是IE8的一个版本,或者可能是IE7,这取决于您的Visual Studio发布时的稳定版本


我对XLST的了解还不足以解释它为什么不起作用,但这可以解释您看到的行为差异。

您可能会发现嵌入Visual Studio的浏览器不是IE9。它很可能是IE8的一个版本,或者可能是IE7,这取决于您的Visual Studio发布时的稳定版本


我对XLST的了解还不足以解释它为什么不起作用,但这可以解释您看到的行为差异。

IE使用MSXML作为XSLT处理器(我认为IE 9使用MSXML 6),而Visual Studio使用XslCompiledTransform。MSXML和XslCompiledTransform所公开和使用的API差别很大,因此不要期望针对MSXML API编写的扩展函数代码能够与XslCompiledTransform和.NET API一起使用。有关使用扩展函数时XSLT/XPath类型如何映射到.NET类型的信息,请参见。在本例中,您从XSLT传入一个节点集和一个字符串,该节点集和字符串映射到.NET中的XPathNodeIterator和一个字符串。 下面是重写.NET扩展函数的快速尝试:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:msxsl="urn:schemas-microsoft-com:xslt"
xmlns:user="urn:custom-scripts">
  <msxsl:script language="JScript" implements-prefix="user">
    <![CDATA[
function test(nodeIterator, string)
{
  nodeIterator.MoveNext();
  return nodeIterator.Current.SelectSingleNode("breakfast" + string);
}
]]>
  </msxsl:script>
  <xsl:template match="/">
    <HTML>
      <BODY STYLE="font-family:Arial, helvetica, sans-serif; font-size:12pt;
            background-color:#EEEEEE">
        <xsl:value-of select="user:test(., '-menu')"/>
      </BODY>
    </HTML>
  </xsl:template>
</xsl:stylesheet>

[编辑] 哎呀,我没想到您自己已经找到了.NET代码,只想知道如何针对这两个XSLT处理器编写代码。这很难。您的目标平台和目标是什么?您是否希望为IE编写XSLT,但使用VS开发?或者你真的需要在IE和.NET平台上使用相同的样式表吗

下面尝试为两种类型的处理器编写一个扩展函数:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:msxsl="urn:schemas-microsoft-com:xslt"
xmlns:user="urn:custom-scripts">
  <msxsl:script language="JScript" implements-prefix="user">
    <![CDATA[
function test(nodeSet, string)
{
  if (typeof nodeSet.nextNode !== 'undefined') {
    var node = nodeSet.nextNode();
    return node.selectSingleNode('breakfast' + string);
  }
  else if (typeof nodeSet.MoveNext !== 'undefined') {
    nodeSet.MoveNext();
    return nodeSet.Current.SelectSingleNode("breakfast" + string);
  }
}
]]>
  </msxsl:script>
  <xsl:template match="/">
    <HTML>
      <BODY STYLE="font-family:Arial, helvetica, sans-serif; font-size:12pt;
            background-color:#EEEEEE">
        <xsl:value-of select="user:test(., '-menu')"/>
      </BODY>
    </HTML>
  </xsl:template>
</xsl:stylesheet>

IE使用MSXML作为其XSLT处理器(我认为IE9使用MSXML 6),而VisualStudio使用XslCompiledTransform。MSXML和XslCompiledTransform所公开和使用的API差别很大,因此不要期望针对MSXML API编写的扩展函数代码能够与XslCompiledTransform和.NET API一起使用。有关使用扩展函数时XSLT/XPath类型如何映射到.NET类型的信息,请参见。在本例中,您从XSLT传入一个节点集和一个字符串,该节点集和字符串映射到.NET中的XPathNodeIterator和一个字符串。 下面是重写.NET扩展函数的快速尝试:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:msxsl="urn:schemas-microsoft-com:xslt"
xmlns:user="urn:custom-scripts">
  <msxsl:script language="JScript" implements-prefix="user">
    <![CDATA[
function test(nodeIterator, string)
{
  nodeIterator.MoveNext();
  return nodeIterator.Current.SelectSingleNode("breakfast" + string);
}
]]>
  </msxsl:script>
  <xsl:template match="/">
    <HTML>
      <BODY STYLE="font-family:Arial, helvetica, sans-serif; font-size:12pt;
            background-color:#EEEEEE">
        <xsl:value-of select="user:test(., '-menu')"/>
      </BODY>
    </HTML>
  </xsl:template>
</xsl:stylesheet>

[编辑] 哎呀,我没想到您自己已经找到了.NET代码,只想知道如何针对这两个XSLT处理器编写代码。这很难。您的目标平台和目标是什么?您是否希望为IE编写XSLT,但使用VS开发?或者你真的需要在IE和.NET平台上使用相同的样式表吗

下面尝试为两种类型的处理器编写一个扩展函数:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:msxsl="urn:schemas-microsoft-com:xslt"
xmlns:user="urn:custom-scripts">
  <msxsl:script language="JScript" implements-prefix="user">
    <![CDATA[
function test(nodeSet, string)
{
  if (typeof nodeSet.nextNode !== 'undefined') {
    var node = nodeSet.nextNode();
    return node.selectSingleNode('breakfast' + string);
  }
  else if (typeof nodeSet.MoveNext !== 'undefined') {
    nodeSet.MoveNext();
    return nodeSet.Current.SelectSingleNode("breakfast" + string);
  }
}
]]>
  </msxsl:script>
  <xsl:template match="/">
    <HTML>
      <BODY STYLE="font-family:Arial, helvetica, sans-serif; font-size:12pt;
            background-color:#EEEEEE">
        <xsl:value-of select="user:test(., '-menu')"/>
      </BODY>
    </HTML>
  </xsl:template>
</xsl:stylesheet>


我想知道这个答案是否有意义

我想知道这个答案是否有意义

谢谢-我想你已经找到了答案。我不想两者都开发,我想这只是一个工作流问题-在部署到IE之前,我在Visual Studio中进行了调试,所以这让我有些头疼。谢谢-我想你已经找到了答案。我不想两者都开发,我想这只是一个工作流问题——在部署到IE之前,我在Visual Studio中进行了调试,所以这让我有些头疼。谢谢,很有趣。SelectSingleNode()(如我上面的示例中所示)似乎在IE9中工作,所以我不知道他们是否将其添加回了…谢谢,很有趣。SelectSingleNode()(如我上面的示例中所示)似乎在IE9中工作,因此我不知道他们是否将其添加回了。。。。