Pergunta

Eu quero algo parecido com isto:

<msxsl:script language="C#">
   ??? getNodes() { ... return ... }
</msxsl:script>

<xsl:for-each select="user:getNodes()">
    ...
</xsl:for-each>

O tipo de retorno que eu deveria usar para getNodes() e o que devo colocar nele o corpo?

Foi útil?

Solução

Em princípio, você precisa usar o XPathNodeIterator para retornar conjuntos de nodos (como diz Samjudson). Presumo que o exemplo que você deu é uma função degenerado, como você não fornecê-lo com quaisquer parâmetros. No entanto, eu acho que é instrutivo a ver como você poderia nós Fabricar fora do ar.

<msxsl:script language="C#">
   XPathNodeIterator getNodes() 
   { 
      XmlDocument doc = new XmlDocument();
      doc.PreserveWhitespace = true;
      doc.LoadXml("<root><fld>val</fld><fld>val2</fld></root>");
      return doc.CreateNavigator().Select("/root/fld");
   }
</msxsl:script>

No entanto, normalmente você iria querer fazer algo em sua função que não é possível em XSLT, como filtrar um conjunto de nós com base em alguns critérios. Um critério que é melhor implementadas através de código ou depende om alguma estrutura de dados externo. Outra opção é justo que você faria para simplificar uma expressão prolixo (como no exemplo abaixo). Então você teria que passar alguns parâmetros para que você getNodes função. Para simplificar eu uso uma filtragem baseada XPath mas poderia ser qualquer coisa:

   <msxsl:script language="C#">
       XPathNodeIterator getNodes(XPathNodeIterator NodesToFilter, string Criteria)
      {
         XPathNodeIterator x = NodesToFilter.Current.Select("SOMEVERYCOMPLEXPATH["+Criteria+"]");
         return x;
      }
   </msxsl:script>
   <xsl:for-each select="user:getNodes(values/val,'SomeCriteria')">
    ...
  </xsl:for-each>

Espera que isso ajuda, Boaz

Outras dicas

Uma rápida no google para C msxml # xslt revelou um link para a página seguinte que dá muitos exemplos de extensão XSLT em ambientes Microsoft.

http://msdn.microsoft.com/en-us/magazine /cc302079.aspx

Especificamente a secção Tipos de mapeamento entre XSLT e .Net lhe dá exatamente a informação que você precisa:

W3C XPath Type - Equivalente .NET Class (Type)

  • String - System.String
  • Boolean - System.Boolean
  • Number - System.Double
  • Resultado Árvore Fragmento - System.Xml.XPath.XPathNavigator
  • conjunto de nós - System.Xml.XPath.XPathNodeIterator

Assim, no seu exemplo, eu iria tentar XPathNodeLiterator.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top