Javascript 使用XSLT2.1的xsl:stream

Javascript 使用XSLT2.1的xsl:stream,javascript,xslt,Javascript,Xslt,我有一个将xsl应用于xml的javascript转换程序。 为了使用xsl:stream特性,我需要使用XSLT2.1 现在脚本如下所示: main(); function main() { if ( WScript.Arguments.length != 3 ) { WScript.Echo("Usage: runTransform.js <xslfilename> <xmlfilename> <outputfil

我有一个将xsl应用于xml的javascript转换程序。 为了使用xsl:stream特性,我需要使用XSLT2.1

现在脚本如下所示:

       main();

function main()
{
    if ( WScript.Arguments.length != 3 )
    {
        WScript.Echo("Usage: runTransform.js <xslfilename> <xmlfilename> <outputfilename>");
        WScript.Quit();
    }
    var xslfilename = WScript.Arguments.Item(0);
    var xmlfilename = WScript.Arguments.Item(1);
    var outputfilename = WScript.Arguments.Item(2);
    var doc = LoadDOM(xmlfilename);
    var xsl = LoadDOM(xslfilename);

  var str = doc.transformNode(xsl);


var ado = new ActiveXObject("ADODB.Stream");
ado.Open();
ado.Position = 0;
ado.CharSet = "UTF-8";
ado.WriteText(str);
ado.SaveToFile(outputfilename, 2)

}

function LoadDOM(file)
{
   var dom;
   try {
     dom = MakeDOM(null);
     dom.load(file);
   }
   catch (e) {
     alert("error" + e.description);
   }
   return dom;
}

function MakeDOM(progID)
{
  if (progID == null) {
    progID = "msxml2.DOMDocument.4.0";
  }

  var dom;
  try {
      WScript.Echo("ProgID is dom 4");
    dom = new ActiveXObject(progID);
    dom.async = false;
    dom.validateOnParse = false;
    //dom.resolveExternals = false;
  }
  catch (e) {
    alert("MakeDom Error :" + e.description);
  }
  return dom;
}

function alert(str)
{
  WScript.Echo(str);
}
<?xml version="1.0" encoding="ISO-8859-1"?>
<!-- Edited by XMLSpy® -->
<transactions>
  <transaction value="12.51"/>
  <transaction value="3.99"/>
</transactions>
   <?xml version="1.0" encoding="ISO-8859-1" ?> 
   <!--  Edited by XMLSpy® --> 
  <xsl:stylesheet version="2.1" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:mode streamable="yes" /> 
  <xsl:stream href="E:\test_folder_stream\transactions.xml">
  <count>
  <xsl:value-of select="count(transactions/transaction)" /> 
  </count>
  </xsl:stream>
  </xsl:stylesheet>
<?xml version="1.0"?>
test.js transactions.xsl transactions.xml output.xml
脚本不会抛出任何错误。 我编写的xsl是否不完整? 任何建议或链接都是有价值的

提前谢谢
Tazim.

我认为目前没有任何XSLT处理器可以实现
xsl:stream

Saxon 9.3实现了XSLT 2.1(现在的XSLT 3.0)工作草案中的许多流功能,但还没有实现xsl:stream指令。我怀疑您使用的是XSLT1.0处理器。如果在样式表中指定version=“2.1”并将其扔给XSLT1.0处理器,它将忽略它不理解的xsl:stylesheet元素的所有子元素

事实上,
xsl:stream
在XSLT 3.0中定义为一条指令,因此它不能作为
xsl:stylesheet
的子项出现-它需要放在函数或模板中


如果需要流式处理,请获取一份Saxon 9.3 Enterprise Edition的副本,并仔细阅读文档,查看当前实现的工作草案的子集。不幸的是,您将无法从JavaScript中使用它。

xsl中是否真的存在这些(
-
)符号?或者只是粘贴噪音?删除(-)标志。这个概念对我来说是新的。尝试使用它编写xsl很奇怪:在规范中使用了
streamable
,而示例使用
streaming
test.js transactions.xsl transactions.xml output.xml