C# 通过msxsl名称空间进行转换

C# 通过msxsl名称空间进行转换,c#,xml,xslt,C#,Xml,Xslt,我正在使用XSLT转换模板,它与MSSQL数据库一起工作,我必须在其中进行一些复杂的计算。我在下面展示了一段代码。重要的是GetZaloha方法。它返回一个大的xml元素,我希望通过它来输出xml,但是obv。这种方法不起作用。我试图通过xElem.ToString()以字符串形式返回值,但结果以字符串形式表示(ofc.)。因此“”标记表示为转义的>和<。 有人知道如何为转换提供一些对象,这些对象将表示为xml结构化文本吗?多谢各位 <msxsl:script implements

我正在使用XSLT转换模板,它与MSSQL数据库一起工作,我必须在其中进行一些复杂的计算。我在下面展示了一段代码。重要的是GetZaloha方法。它返回一个大的xml元素,我希望通过它来输出xml,但是obv。这种方法不起作用。我试图通过xElem.ToString()以字符串形式返回值,但结果以字符串形式表示(ofc.)。因此“”标记表示为转义的>和<。 有人知道如何为转换提供一些对象,这些对象将表示为xml结构化文本吗?多谢各位

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

列表
奥德波切扎洛伊

您当前正在使用
将函数结果包含到XML输出中。该标记总是通过(或多或少地)从XML节点树中提取文本部分来展平XML节点树。我建议你使用

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


相反,它将完整的节点树(无需更改)复制到XML输出中。

您当前正在使用
将函数结果包含到XML输出中。该标记总是通过(或多或少地)从XML节点树中提取文本部分来展平XML节点树。我建议你使用

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


相反,它将完整的节点树(无需更改)复制到XML输出中。

您当前正在使用
将函数结果包含到XML输出中。该标记总是通过(或多或少地)从XML节点树中提取文本部分来展平XML节点树。我建议你使用

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


相反,它将完整的节点树(无需更改)复制到XML输出中。

您当前正在使用
将函数结果包含到XML输出中。该标记总是通过(或多或少地)从XML节点树中提取文本部分来展平XML节点树。我建议你使用

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


相反,它将完整的节点树(无需更改)复制到XML输出中。

一些解决方案:使用XSLT转换扩展对象写入输出XML,并使用XmlWriter方法WriteData:

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; } } 公共类CDATA编写器 { 公共静态XDocument转换(XDocument文档、字符串文件XSLT) { XsltArgumentList xslArg=new XsltArgumentList(); XslCompiledTransform trans=新的XslCompiledTransform(); trans.Load(fileXslt); XDocument xmlOutput=新XDocument(); 使用(var writer=xmlOutput.CreateWriter()) { CDATA编写器信息=新的CDATA编写器(编写器); AddExtensionObject(“urn:cdata”,info); trans.Transform(输入:doc.CreateReader(),参数:xslArg,结果:writer); } 返回输出; } 受保护的CDATA编写器(XmlWriter编写器){this.writer=writer;} XmlWriter-writer; 公共字符串CData(对象obj) { if(obj!=null&&obj是System.Xml.XPath.XPathNodeIterator) { var iter=obj as System.Xml.XPath.XPathNodeIterator; 如果(iter.Count>0&&iter.MoveNext()) { 无功电流=额定电流; WriteCData(current.OuterXml); } } 返回字符串。空; } } 示例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>

一些解决方案:使用XSLT转换扩展对象编写输出XML,并使用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; } } 公共类CDATA编写器 { 公共静态XDocument转换(XDocument文档、字符串文件XSLT) { XsltArgumentList xslArg=new XsltArgumentList(); XslCompiledTransform trans=新的XslCompiledTransform(); trans.Load(fileXslt); XDocument xmlOutput=新XDocument(); 使用(var writer=xmlOutput.CreateWriter()) { CDATA编写器信息=新的CDATA编写器(编写器); AddExtensionObject(“urn:cdata”,info); trans.Transform(输入:doc.CreateReader(),参数:xslArg,结果:writer); } 返回输出; } 受保护的CDATA编写器(XmlWriter编写器){this.writer=writer;} XmlWriter-writer; 公共字符串CData(对象obj) { if(obj!=null&&obj是System.Xml.XPath.XPathNodeIterator) { var iter=obj as System.Xml.XPath.XPathNodeIterator; 如果(iter.Count>0&&iter.MoveNext()) { 无功电流=额定电流; WriteCData(current.OuterXml); } } 返回字符串。空; } } 示例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>

一些解决方案:使用XSLT转换扩展对象编写输出XML,并使用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; } } 公共类CDATA编写器 { 公共静态XDocument转换(XDocument文档、字符串文件XSLT) { XsltArgumentList xslArg=new XsltArgumentList(); XslCompiledTransform trans=新的XslCompiledTransform(); trans.Load(fileXslt); XDocument xmlOutput=新XDocument(); 使用(var writer=xmlOutput.CreateWriter()) { CDATA编写器信息=新的CDATA编写器(编写器); AddExtensionObject(“urn:cdata”,info); trans.Transform(输入:doc.CreateReader(),参数:xslArg,结果:writer); } 返回输出; } 受保护的CDATA编写器(XmlWriter编写器){this.writer=writer;} XmlWriter-writer; 公共字符串CData(对象obj) { 如果(obj!=null&&obj是System.Xml.X