我的网站项目中有一个xml文件和一个xslt文件。
xml文件:
<root>
<employee>
<firstname>Kaushal</firstname>
<lastname>Parik</lastname>
</employee>
<employee>
<firstname>Abhishek</firstname>
<lastname>Swarnkar</lastname>
</employee>
</root>
XSLT:
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:msxsl="urn:schemas-microsoft-com:xslt" exclude-result-prefixes="msxsl" xmlns:Concat="urn:XslSample">
<xsl:output method="html" indent="yes"/>
<xsl:template match="root">
<xsl:for-each select="employee">
<![CDATA[Concatenated name is ]]>
<xsl:value-of select="Concat:GetFullName(firstname,lastname)"/>
<xsl:value-of select="age"/>
<br />
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
aspx.cs:
using System;
using System.Configuration;
using System.Data;
using System.Linq;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Xml.Linq;
using System.Xml.XPath;
using System.Xml.Xsl;
using System.Xml;
using System.IO;
public partial class _Default : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
try
{
MemoryStream objStream = new MemoryStream();
StreamWriter objWriter = new StreamWriter(objStream, System.Text.Encoding.UTF8);
XPathDocument doc = new XPathDocument(Server.MapPath("XMLFile.xml"));
XslCompiledTransform trans = new XslCompiledTransform();
trans.Load(Server.MapPath("XSLTFile.xslt"));
//create the XslArgumentList and new BookUtils object
XsltArgumentList argList = new XsltArgumentList();
Concat objUtil = new Concat();
//this tells the argumentlist about BookUtils
argList.AddExtensionObject("urn:XslSample", objUtil);
//new XPathNavigator
XPathNavigator nav = doc.CreateNavigator();
//do the transform
trans.Transform(nav, argList, objWriter);
//objWriter.Flush();
objStream.Position = 0;
StreamReader oReader = new StreamReader(objStream);
string strResult = oReader.ReadToEnd();
//objWriter.Close();
//oReader.Close();
Response.Write(strResult);
}
catch (Exception Ex)
{ Response.Write(Ex.Message); }
}
}
public class Concat
{
public Concat()
{ }
public string GetFullName(string firstname, string lastname)
{ return "Mr." + firstname; }
}
当我运行网站时,我需要从xslt调用ac#函数并更改xml文件中的值....我通过ac#code在每个名字前面添加一个文本(比如“Mr.”) ....添加后,它将输出写为响应,但不修改原始xml。我希望它能反映在xml文件中....
需要xml输出:
<root>
<employee>
<firstname>Mr.Kaushal</firstname>
<lastname>Parik</lastname>
</employee>
<employee>
<firstname>Mr.Abhishek</firstname>
<lastname>Swarnkar</lastname>
</employee>
</root>
另外,作为下一步,我需要通过另一个c#函数在xml文件中添加另一个节点(比如年龄)....请注意,应该从我的xslt文件调用c#函数....可以有人用这个简单的代码帮助我????
需要最终的xml:
<root>
<employee>
<firstname>Mr.Kaushal</firstname>
<lastname>Parik</lastname>
<age>34</age>
</employee>
<employee>
<firstname>Mr.Abhishek</firstname>
<lastname>Swarnkar</lastname>
<age>30</age>
</employee>
</root>
答案 0 :(得分:1)
您可以考虑在此处使用XmlDocument类;
例如,您实际上在XslTransform的流输出中拥有所需的XML:
XmlDocument resultDocument = new XmlDocument();
resultDocument.Load(objStream);
resultDocument.Save(Server.MapPath("XMLFile.xml"));
EDIT。您还需要更改XSLT才能使其正常工作。类似的东西:
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:msxsl="urn:schemas-microsoft-com:xslt" exclude-result-prefixes="msxsl" xmlns:Concat="urn:XslSample">
<xsl:output method="xml" indent="yes"/>
<xsl:template match="/">
<root>
<xsl:apply-templates select="/root/employee" />
</root>
</xsl:template>
<xsl:template match="employee">
<employee>
<firstname>Mr. <xsl:value-of select="./firstname"/></firstname>
<lastname><xsl:value-of select="./lastname"/></lastname>
<age>24</age>
</employee>
</xsl:template>
</xsl:stylesheet>
应该有效。然而,这可能不是最好的方法,因为你需要提供每人的年龄,而你似乎并不是从任何地方采购这个。我推荐使用DOM方法。
但你也必须小心。可以想象,如果文件被另一个进程读取,则可能存在读锁定。如果这是一次性的练习,我会考虑在部署您的网站之前这样做。
另一种选择是不使用XSLT。在这种情况下,您还可以考虑简单的DOM处理:
XmlDocument doc = new XmlDocument();
doc.Load(Server.MapPath("XMLFile.xml"));
XmlNodeList employeeNodes = doc.SelectNodes("//employee");
foreach(XmlNode employeeNode in employeeNodes)
{
employeeNode.SelectSingleNode("./firstname").InnerText = String.Format("Mr. {0}", employeeNode.SelectSingleNode("./firstname").InnerText);
XmlNode ageNode = doc.CreateElement("age");
ageNode.InnerText = "3 Billion Years";
employeeNode.ChildNodes.Add(ageNode0;
}
doc.Save();
我没有编译检查此代码,但希望意图很明确。请注意,如果您愿意,也可以使用XDocument。
答案 1 :(得分:0)
请问问题的第一步,请参考this question的回答。
对于下一步的回答,请使用以下xsl:
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:msxsl="urn:schemas-microsoft-com:xslt" exclude-result-prefixes="msxsl"
xmlns:myUtils="pda:MyUtils">
<xsl:output method="xml" indent="yes"/>
<xsl:variable name="vQ">Mr. </xsl:variable>
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="employee/firstname">
<xsl:element name="firstname">
<xsl:value-of select="myUtils:FormatName(.)" />
</xsl:element>
<xsl:element name="Age">
<xsl:value-of select="myUtils:AddAge()" />
</xsl:element>
</xsl:template>
<xsl:template match="employee/firstname">
<xsl:element name="firstname">
<xsl:value-of select="myUtils:FormatName(.)" />
</xsl:element>
</xsl:template>
<xsl:template match="employee">
<xsl:element name="employee">
<xsl:apply-templates select="@* | *"/>
<xsl:element name="Age">
<xsl:value-of select="myUtils:AddAge()" />
</xsl:element>
</xsl:element>
</xsl:template>
</xsl:stylesheet>
在MyXslExtension类中添加以下函数:
public string AddAge()
{
return "25";
}
您将获得如下输出:
<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet type="text/xsl" href="cdcatalog.xsl"?>
<root>
<employee>
<firstname>Mr. Kaushal</firstname>
<lastname>Parik</lastname>
<Age>25</Age>
</employee>
<employee>
<firstname>Mr. bhishek</firstname>
<lastname>Swarnkar</lastname>
<Age>25</Age>
</employee>
</root>
希望这会对你有帮助....