样式化 xml 返回相同的 xml 文档,一种使代码工作的方法

本文关键字:xml 一种 代码 方法 工作 返回 样式 文档 | 更新日期: 2023-09-27 18:26:20

 SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["ICDBConnectionString"].ConnectionString);
        conn.Open();
        string SQL = "Select TUReportData from TUReport WHERE ConsumerID = @ConsumerID";
        SqlCommand cmd = new SqlCommand(SQL, conn);
        cmd.Parameters.Add(new SqlParameter("@ConsumerID", txtIDNumber.Text));
        SqlDataAdapter adapter = new SqlDataAdapter(cmd);
        DataTable dt = new DataTable();
        adapter.Fill(dt);
        dt.TableName = "XMLData";
        dt.ToString();
        dt.WriteXml("C:/inetpub/wwwroot/TUWebServiceCaller/Log/temp.xml");
        // Getting file path    
        string strXSLTFile = Server.MapPath("styles/style.xslt");
        string strXMLFile = Server.MapPath("Log/temp.xml");
        // Creating XSLCompiled object    
        XslCompiledTransform objXSLTransform = new XslCompiledTransform();
        objXSLTransform.Load(strXSLTFile);
        // Creating StringBuilder object to hold html data and creates TextWriter object to hold data from XslCompiled.Transform method    
        StringBuilder htmlOutput = new StringBuilder();
        TextWriter htmlWriter = new StringWriter(htmlOutput);
        // Creating XmlReader object to read XML content    
        XmlReader reader = XmlReader.Create(strXMLFile);
        // Call Transform() method to create html string and write in TextWriter object.    
        objXSLTransform.Transform(reader, null, htmlWriter);
        Results.InnerHtml  = htmlOutput.ToString();
        // Closing xmlreader object    
        reader.Close();

运行时没有错误,但 XSLT 似乎没有设置 XML 的样式,因为它以传入的相同格式返回。 整个 XML 应该重新格式化,并显示我自己的整个页面版本以及我指定的节点

XSLT这就是 XSLT 示例

<xsl:for-each select="AddressNA08">
    <tr>
        <td>
            <xsl:value-of select="ConsumerNo"/>
        </td>
        <td>
            <xsl:value-of select="InformationDate"/>
        </td>
        <td>
            <xsl:value-of select="Line1"/>
        </td>
        <td>
            <xsl:value-of select="Line2"/>
        </td>
        <td>
            <xsl:value-of select="Suburb"/>
        </td>
        <td>
            <xsl:value-of select="City"/>
        </td>
        <td>
            <xsl:value-of select="PostalCode"/>
        </td>
        <td>
            <xsl:value-of select="ProvinceCode"/>
        </td>
        <td>
            <xsl:value-of select="Province"/>
        </td>
        <td>
            <xsl:value-of select="AddressPeriod"/>
        </td>
        <td>
            <xsl:value-of select="OwnerTenant"/>
        </td>
        <td>
            <xsl:value-of select="AddressChanged"/>
        </td>
    </tr>
</xsl:for-each>

该 XML

<AddressNA08>
    <ConsumerNo>645511310</ConsumerNo>
    <InformationDate>20090227</InformationDate>
    <Line1>8 HAAKBOS ST</Line1>
    <Line2 />
    <Suburb>ONVERWACHT</Suburb>
    <City>ELLISRAS</City>
    <PostalCode>0557</PostalCode>
    <ProvinceCode>
        NP
    </ProvinceCode>
    <Province>LIMPOPO</Province>
    <AddressPeriod>
        06
    </AddressPeriod>
    <OwnerTenant>O</OwnerTenant>
    <AddressChanged>N</AddressChanged>
</AddressNA08>

这些是我正在使用的所有文件

样式化 xml 返回相同的 xml 文档,一种使代码工作的方法

使用这样的方法,我通过xslt将xlft转换为xhtml:

   public static XmlDocument TransformToHtml(XmlDocument XmlDoc, XmlDocument XSLT) {
        var bArr = new System.Text.UTF8Encoding().GetBytes(XmlDoc.InnerXml);
        MemoryStream m = new MemoryStream(bArr);
        System.Xml.XPath.XPathDocument xDoc;
        XmlReaderSettings xrs = new XmlReaderSettings();
        xrs.CheckCharacters = false;
        using (XmlReader xr = XmlReader.Create(m, xrs)) {
            xDoc = new System.Xml.XPath.XPathDocument(xr);
        }
        StringBuilder resultString = new StringBuilder();
        var ws = new XmlWriterSettings();
        ws.CheckCharacters = false;
        ws.Indent = true;
        ws.OmitXmlDeclaration = true;
        XmlWriter writer = XmlWriter.Create(resultString, ws);
        var sets = new XsltSettings(true, true);
        string transformedXHTML = null;
        XslCompiledTransform transform = new XslCompiledTransform(false);
        transform.Load(XSLT, sets, null);
        transform.Transform(xDoc, writer);
        transformedXHTML = resultString.ToString();
        var doc = new XmlDocument();
        doc.LoadXml(transformedXHTML);
        return doc;
    }

你这样称呼它(注意,缩短了你的xslt!

        var xml = new XmlDocument();
        xml.LoadXml("<AddressNA08><ConsumerNo>645511310</ConsumerNo><InformationDate>20090227</InformationDate><Line1>8 HAAKBOS ST</Line1><Line2 />"
                   + "<Suburb>ONVERWACHT</Suburb><City>ELLISRAS</City><PostalCode>0557</PostalCode><ProvinceCode>NP</ProvinceCode><Province>LIMPOPO</Province>"
                   + "<AddressPeriod>06</AddressPeriod><OwnerTenant>O</OwnerTenant><AddressChanged>N</AddressChanged></AddressNA08>");
        var xslt = new XmlDocument();
        xslt.LoadXml("<xsl:stylesheet xmlns:xsl='http://www.w3.org/1999/XSL/Transform' xmlns='http://www.w3.org/1999/xhtml' version='1.0'>" +
                     "<xsl:output encoding='UTF-8' indent='yes' method='xml' standalone='no' omit-xml-declaration='no'/><xsl:template match='/'><xsl:for-each select='AddressNA08'>" +
                     "<tr><td><xsl:value-of select='ConsumerNo'/></td><td><xsl:value-of select='InformationDate'/></td><td><xsl:value-of select='Line1'/></td>" +
                     "<td><xsl:value-of select='Line2'/></td><td><xsl:value-of select='Suburb'/></td></tr></xsl:for-each></xsl:template></xsl:stylesheet>");
        var reslt = TransformToHtml(xml, xslt);

您显示的 XML 文档和样式表确实会生成与输入文档不同的输出,因此这不是错误的原因。我仍然想添加一个答案,因为您的 XSLT 样式表肯定需要改进,我认为这是您问题的一部分。

如果您无论如何都要输出所有元素,即使它们在输入中出现的顺序,为什么要写出每个元素名称和td元素?

样式表

<?xml version="1.0" encoding="UTF-8" ?>
<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
    <xsl:output method="html" encoding="UTF-8" indent="yes" />
    <xsl:strip-space elements="*"/>
    <xsl:template match="/">
        <html>
            <xsl:apply-templates/>
        </html>
    </xsl:template>
    <xsl:template match="AddressNA08">
        <tr>
            <xsl:apply-templates/>
        </tr>
    </xsl:template>
    <xsl:template match="*">
        <td>
            <xsl:apply-templates/>
        </td>
    </xsl:template>
</xsl:transform>

网页结果

<html>
   <tr>
      <td>645511310</td>
      <td>20090227</td>
      <td>8 HAAKBOS ST</td>
      <td></td>
      <td>ONVERWACHT</td>
      <td>ELLISRAS</td>
      <td>0557</td>
      <td>
         NP
      </td>
      <td>LIMPOPO</td>
      <td>
         06
      </td>
      <td>O</td>
      <td>N</td>
   </tr>
</html>

在此处在线试用此解决方案。


我将省略实时项目中的一些标签。 或者当我使用您的方式时,这是一种选择要排除的方法?

是的,添加一个附加模板,您可以在其中列出不应出现在输出中的元素的名称。下面是一个示例:

<xsl:template match="City | PostalCode"/>

这是更新的在线版本。