XSL noobie但是卡住了!
我有一个使用c#脚本函数格式化日期的转换,当我在VS 2008中并且运行“show xml output”时这很好用,输出正是我想要的。
但是,当我尝试使用代码运行时,我收到错误
预定义类型'System.Object'不是 定义或导入
要调用转换的函数看起来像这样,在我开始使用脚本之前它非常基础和工作
public static string RunXSLT(string xsltFile, string inputXML) { XslCompiledTransform transform = new XslCompiledTransform(); XsltSettings settings = new XsltSettings(); settings.EnableScript = true; transform.Load(xsltFile, settings, null); StringReader sReader = new StringReader(inputXML); XmlTextReader xmlTextReader = new XmlTextReader(sReader); //Create an XmlTextWriter which outputs to memory stream Stream stream = new MemoryStream(); XmlWriter xmlWriter = new XmlTextWriter(stream,> System.Text.Encoding.UTF8); transform.Transform(xmlTextReader, xmlWriter); stream.Position = 0; XmlDocument XmlDoc = new XmlDocument(); XmlDoc.Load(stream); return XmlDoc.OuterXml; }
XSL转换就是这个..
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0" xmlns:msxsl="urn:schemas-microsoft-com:xslt" xmlns:nlbExtension="urn:nlbExtension" exclude-result-prefixes="msxsl nlbExtension"> <xsl:output method="xml" indent="yes"/> <msxsl:script implements-prefix="nlbExtension" language="C#"> <![CDATA[ public string FormatDateTime(string xsdDateTime, string format) { DateTime date = DateTime.Parse(xsdDateTime); return date.ToString(format); } ]]> </msxsl:script> <xsl:template match="/"> <urlset xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.sitemaps.org/schemas/sitemap/0.9 http://www.sitemaps.org/schemas/sitemap/0.9/sitemap.xsd" xmlns="http://www.sitemaps.org/schemas/sitemap/0.9" <xsl:for-each select="./Collection/Content" > <url> <loc>http://www.nlb.org<xsl:value-of select="./QuickLink/text()"/></loc> <lastmod><xsl:value-of select="./DateModified/text()" /></lastmod> </url> </xsl:for-each> </urlset> </xsl:template> </xsl:stylesheet>
答案 0 :(得分:4)
我知道这个问题已经很老了,但也许这会帮助那些正在寻找这个问题的人。
我目前变成了相同的编译错误,但在完全不同的C#编程主题中。
我正在使用Sharp Develop 4.2并遇到同样的问题。对我来说,解决方案是 添加 “mscorlib”到项目的参考文献。
此错误是Microsoft的已知问题,但不知道当前的情况。刚刚在2010年发现了一些讨论。
不知怎的,这个引用遗失了,我现在还不完全理解为什么我的其他项目在没有明确引用mscorlib的情况下工作,但也许这确实是bug本身; - )
祝你好运 托马斯
答案 1 :(得分:1)
无法重现(实际上,您实际上并未使用xslt中的扩展名)。我测试了它,添加(到xslt):
<xsl:value-of select="nlbExtension:FormatDateTime(.,'dd MMM yyyy')"/>
并使用输入xml:
string xml = new XElement("xml", DateTime.Now).ToString();
它工作正常(我更改为XmlConvert.ToDateTime
以匹配xsd格式,但无论如何都可以正常工作。)
如果出现问题,则表示您没有向我们展示。
答案 2 :(得分:0)
这是一个更简单的例子,(抱歉打字错误),再一次在VS2008中可以运行XML而不是样式表,但使用的是C#代码
未定义或导入预定义类型“System.Object”
代码
public void RunFileXSLT() { // Open books.xml as an XPathDocument. XPathDocument doc = new XPathDocument("c:\\temp\\raw.xml"); // Create a writer for writing the transformed file. XmlWriter writer = XmlWriter.Create("c:\\temp\\OutputTest.xml"); // Create and load the transform with script execution enabled. XslCompiledTransform transform = new XslCompiledTransform(); XsltSettings settings = new XsltSettings(); settings.EnableScript = true; transform.Load("c:\\temp\\Simple.xslt", settings, null); // Execute the transformation. transform.Transform(doc, writer); }
xml就是这个
<xml> <item> <date>11/11/2009</date> </item> <item> <date>11/11/2009</date> </item> </xml>
变换就是这个
<?xml version="1.0" encoding="ISO-8859-1"?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0" xmlns:msxsl="urn:schemas-microsoft-com:xslt" xmlns:nlbExtension="urn:nlbExtension" exclude-result-prefixes="msxsl nlbExtension"> <xsl:output method="xml" indent="yes"/> <msxsl:script implements-prefix="nlbExtension" language="C#"> <![CDATA[ public string FormatDateTime(string xsdDateTime, string format) { DateTime date = DateTime.Parse(xsdDateTime); return date.ToString(format); } ]]> </msxsl:script> <xsl:template match="/"> <urlset xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.sitemaps.org/schemas/sitemap/0.9 http://www.sitemaps.org/schemas/sitemap/0.9/sitemap.xsd" xmlns="http://www.sitemaps.org/schemas/sitemap/0.9" > <xsl:for-each select="./xml/item" > <url> <loc>http://www.a-website.com</loc> <lastmod> <xsl:value-of select="nlbExtension:FormatDateTime(./date,'s')"/> </lastmod> </url> </xsl:for-each> </urlset>