XSLT: невозможно преобразовать операнд в «фрагмент дерева результатов» - PullRequest
5 голосов
/ 20 октября 2010

Я работаю над таблицей стилей xslt, и мне нужно получить в качестве параметра два дополнительных XML.Я получаю сообщение об ошибке при использовании метода node-set () (из пространства имен ms, microsoft).Содержание XML правильное.Параметры отправляются с классическим ASP.

Вот заголовок и вызов в xslt:

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0"
     xmlns:ms="urn:schemas-microsoft-com:xslt"
     xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
>
...
<xsl:param name="xmlPlanning"></xsl:param>
<xsl:variable name="myXml" select="ms:node-set($xmlPlanning)"></xsl:variable>
    <xsl:value-of select="ms:node-set($xmlPlanning)/*"/>

Вот трассировка стека ошибки:

[XsltException: Impossible de convertir l'opérande en 'fragment de l'arborescence résultat'.]
   System.Xml.Xsl.XsltOld.XsltFunctionImpl.ToNavigator(Object argument) +380943
   System.Xml.Xsl.XsltOld.FuncNodeSet.Invoke(XsltContext xsltContext, Object[] args, XPathNavigator docContext) +33
   MS.Internal.Xml.XPath.FunctionQuery.Evaluate(XPathNodeIterator nodeIterator) +292

[XPathException: Échec de la fonction 'ms:node-set()'.]
   MS.Internal.Xml.XPath.FunctionQuery.Evaluate(XPathNodeIterator nodeIterator) +347
   System.Xml.Xsl.XsltOld.Processor.RunQuery(ActionFrame context, Int32 key) +24
   System.Xml.Xsl.XsltOld.VariableAction.Execute(Processor processor, ActionFrame frame) +200
   System.Xml.Xsl.XsltOld.ActionFrame.Execute(Processor processor) +20
   System.Xml.Xsl.XsltOld.Processor.Execute() +82
   System.Xml.Xsl.XsltOld.Processor.Execute(TextWriter writer) +96
   System.Xml.Xsl.XslTransform.Transform(XPathNavigator input, XsltArgumentList args, TextWriter output, XmlResolver resolver) +68
   System.Xml.Xsl.XslTransform.Transform(IXPathNavigable input, XsltArgumentList args, TextWriter output, XmlResolver resolver) +43
   System.Web.UI.WebControls.Xml.Render(HtmlTextWriter output) +132

Ивот начало xml, которое я получаю в параметре:

<?xml version="1.0" encoding="UTF-8"?>
<ArrayOfGenerationPlanningDesign xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://webservices.secureholiday.net/">
  <GenerationPlanningDesign>

В чем может быть моя проблема?

Ответы [ 3 ]

2 голосов
/ 20 октября 2010

Если передаваемый параметр уже является истинным набором узлов (навигатор XPath или XPathNodeIterator в .NET или IXMLDOMNodeList для MSXML), вам не нужно и вы не должны использовать ms:node-set() функция расширения. Просто удалите вызов ms:nodeset().

В случае, если это строка, представляющая XML - ну, это не должно!Разобрать эту строку для одного из допустимых типов параметров для набора узлов и только затем вызвать преобразование - используя истинный набор узлов.

1 голос
/ 20 октября 2010

node-set() работает только с фрагментами результирующего документа (RDF), но вы даете ему строку, которая является чем-то совершенно другим (даже если содержимое строки выглядит как XML).

То, что вы должны сделать, эторазобрать строку в XML.Вы можете использовать скрипт расширения для этого .Следующее работает для меня (проверено с msxsl.exe в командной строке), но если вы не хотите использовать JScript, вы можете использовать C # или любой другой поддерживаемый язык, чтобы сделать то же самое.

<xsl:stylesheet version="1.0"
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  xmlns:ms="urn:schemas-microsoft-com:xslt"
  xmlns:script="urn:my-scripts"
  exclude-result-prefixes="ms script"  
>
  <ms:script language="JScript" implements-prefix="script">
    <![CDATA[
    function stringToXml(str) {
      var xml = new ActiveXObject("MSXML2.DOMDocument.4.0");
      xml.async = false;
      xml.loadXML(str);
      return xml;
    }
    ]]>
  </ms:script>

  <xsl:param name="xmlPlanning"></xsl:param>

  <xsl:variable name="myXml" select="script:stringToXml(string($xmlPlanning))" />

  <xsl:template match="/">
    <xsl:value-of select="$myXml/*" /><!-- whatever -->
  </xsl:template>

</xsl:stylesheet>
0 голосов
/ 06 апреля 2012

Как сказал Димитр, вы можете использовать мс: набор узлов , но вы должны использовать node ()

<xsl:variable name="yourVariable">
        <xsl:copy-of select="/foo/bar/something/node()"/>        
</xsl:variable>

<xsl:value-of select="ms:node-set($yourVariable)/theOtherElement"/>
...