样式化 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>
这些是我正在使用的所有文件
使用这样的方法,我通过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"/>
这是更新的在线版本。