2013-12-17 5 views
0

Я использую шаблон преобразования XSLT, который работает с базой данных MSSQL, в которой я должен выполнять сложные вычисления. Я покажу часть кода ниже. Важным является метод GetZaloha. Он возвращает большой элемент xml, который я хочу передать ему для вывода xml, но obv. этот подход не работает. Я попытался вернуть значение как строку через xElem.ToString(), но результат представлен (ofc.) Как строка. поэтому метки «<» и «>» представлены как экранированные & gt и & lt. У кого-нибудь есть идея, как обеспечить некоторый объект преобразованию, который будет представлен как XML-структурированный текст? Большое спасибо.Преобразование через пространство имен msxsl

<msxsl:script implements-prefix="utility" language="C#"> 
    <msxsl:assembly name="System"/> 
    <msxsl:assembly name="System.Data"/> 
    <msxsl:using namespace="System"/> 
    <msxsl:using namespace="System.Xml"/>  
    <msxsl:assembly name="System.Core" /> 
    <msxsl:assembly name="System.Xml.Linq" /> 
    <msxsl:using namespace="System.Collections.Generic" /> 
    <msxsl:using namespace="System.Linq" /> 
    <msxsl:using namespace="System.Xml.Linq" /> 
    <![CDATA[ 
    public static XElement GetZaloha(string VariableSymbol) 
    { 
     XElement xElem = ..... 
     return xElem; 
    } 
    ]]> 
    </msxsl:script> 

    <xsl:template match="@* | node()"> 
     <xsl:copy> 
      <xsl:apply-templates select="@* | node()"/> 
     </xsl:copy> 
    </xsl:template> 

    <xsl:template match="CisloDokladu"> 
    <xsl:element name="CisloDokladu"> 
     <xsl:copy-of select="@*" /> 
     <xsl:apply-templates /> 
    </xsl:element> 
    <xsl:variable name="VariabilniSymbol" select="./VariabilniSymbol"/> 
     <xsl:element name="OdpoctyZaloh"> 
     <xsl:attribute name="ObjectType">List</xsl:attribute> 
     <xsl:attribute name="ObjectName">OdpocetZalohy</xsl:attribute> 
     <xsl:value-of select="utility:GetZaloha($VariabilniSymbol)" /> 
     </xsl:element> 
    </xsl:template> 
+0

Я редактировал свой титул. Пожалуйста, смотрите: «Если вопросы включают« теги »в их названиях?] (Http://meta.stackexchange.com/questions/19190/), где консенсус« нет, они не должны ». –

ответ

0

Некоторые решения: написать выходной XML с помощью XSLT преобразования объекта расширения и использовать XmlWriter метод WriteCData:

 
    public class CDataWriter 
    { 
     public static XDocument Transform(XDocument doc, string fileXslt) 
     { 
      XsltArgumentList xslArg = new XsltArgumentList(); 
      XslCompiledTransform trans = new XslCompiledTransform(); 

      trans.Load(fileXslt); 

      XDocument xmlOutput = new XDocument(); 
      using (var writer = xmlOutput.CreateWriter()) 
      { 
       CDataWriter info = new CDataWriter(writer); 
       xslArg.AddExtensionObject("urn:cdata", info); 

       trans.Transform(input: doc.CreateReader(), arguments: xslArg, results: writer); 
      } 
      return xmlOutput; 
     } 

     protected CDataWriter(XmlWriter writer) { this.writer = writer; } 
     XmlWriter writer; 

     public string CData(object obj) 
     { 
      if (obj != null && obj is System.Xml.XPath.XPathNodeIterator) 
      { 
       var iter = obj as System.Xml.XPath.XPathNodeIterator; 
       if (iter.Count > 0 && iter.MoveNext()) 
       { 
        var current = iter.Current; 
        writer.WriteCData(current.OuterXml); 
       } 
      } 
      return string.Empty; 
     } 

    } 

Пример файла XSLT:

<?xml version="1.0"?> 
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0" 
     xmlns:trans="urn:cdata"> 
    <xsl:template name="cdata"> 
    <Result> 
     <xsl:value-of select="trans:CData(*)" /> 
    </Result> 
    </xsl:template> 
</xsl:stylesheet> 
0

Вы используете <xsl:value-of> включить вашу функцию результат в ваш вывод XML. Этот тег всегда flattens дерево узлов XML (более или менее) извлекает из него только текстовые части. Я бы предположил, что вместо этого вы используете

<xsl:copy-of select="utility:GetZaloha($VariabilniSymbol)" /> 

, который копирует полное дерево узлов (без изменений) в выход XML.

+0

К сожалению, если я использую строку типа возвращаемого значения, это расшифровывает теги xml в escaped string как: < OdpocetZalohy ID = "" ObjectType = "Object" ObjectName = "OdpocetZalohy" > и когда я пытаюсь вернуть XElement вместо строки из метода GetZaloha, он выдает исключение , –

+0

Что такое исключение? –

+0

Ошибка преобразования XSL. Подробнее см. В разделе «Выходные окна». Окно вывода говорит: Параметры функции расширения или возвращаемые значения, которые имеют тип ClR 'XElement', не поддерживаются. –

Смежные вопросы