используя xsl: stream XSLT 2.1 - PullRequest
0 голосов
/ 11 мая 2011

У меня есть JavaScript, который преобразует, который применяет XSL к XML.Мне нужно использовать XSLT 2.1, чтобы использовать функцию xsl: stream.

Теперь скрипт выглядит следующим образом:

       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-файла, который я пробую, выглядит следующим образом:

<?xml version="1.0" encoding="ISO-8859-1"?>
<!-- Edited by XMLSpy® -->
<transactions>
  <transaction value="12.51"/>
  <transaction value="3.99"/>
</transactions>

Применяемый xsl выглядит следующим образом:

   <?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"?>

В идеале я должен получить выводas:

<?xml version="1.0"> 
<count>2</count>

Сценарий выполняется следующим образом:

test.js transactions.xsl transactions.xml output.xml

Сценарий не выдает никаких ошибок.XSL, который я написал, неполный?Любые предложения или ссылки будут полезны.

Заранее спасибо, Тазим.

1 Ответ

1 голос
/ 11 мая 2011

Я не думаю, что в настоящее время имеется какой-либо процессор XSLT, который реализует xsl:stream.

Saxon 9.3 реализует многие функции потоковой передачи в рабочем проекте XSLT 2.1 (теперь XSLT 3.0), но еще не инструкцию xsl: stream. Я подозреваю, что вы используете процессор XSLT 1.0. Если вы укажете version = "2.1" в таблице стилей и добавите его в процессор XSLT 1.0, он будет игнорировать любые дочерние элементы элемента xsl: stylesheet, которые он не понимает.

Фактически xsl:stream определен в XSLT 3.0 как инструкция, поэтому он не может быть дочерним по отношению к xsl:stylesheet - он должен входить в функцию или шаблон.

Если вам нужна потоковая обработка, приобретите копию Saxon 9.3 Enterprise Edition и внимательно прочитайте документацию, чтобы увидеть, какое подмножество рабочего проекта реализовано в настоящее время. К сожалению, вы не сможете использовать его из JavaScript.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...