C# XSLt.transform为我提供了&引用;
我有XML:C# XSLt.transform为我提供了&引用;,c#,xml,xslt,csv,C#,Xml,Xslt,Csv,我有XML: <results> <Countries country="Albania"> <Regions region="Centralna Albania"> <Provinces province="Durres i okolice"> <Cities city="Durres" cityCode=
<results>
<Countries country="Albania">
<Regions region="Centralna Albania">
<Provinces province="Durres i okolice">
<Cities city="Durres"
cityCode="2B66E0ACFAEF78734E3AF1194BFA6F8DEC4C5760">
<IndividualFlagsWithForObjects Status="1" />
<IndividualFlagsWithForObjects Status="0" />
<IndividualFlagsWithForObjects status="2" />
</Cities>
</Provinces>
</Regions>
</Countries>
<Countries ....
我有xslt:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text" encoding="iso-8859-1"/>
<xsl:param name="delim" select="string(',')" />
<xsl:param name="quote" select="string('"')" />
<xsl:param name="break" select="string('
')" />
<xsl:template match="/">
<xsl:apply-templates select="results/countries" />
</xsl:template>
<xsl:template match="countries">
<xsl:apply-templates />
<xsl:if test="following-sibling::*">
<xsl:value-of select="$break" />
</xsl:if>
</xsl:template>
<xsl:template match="*">
<!-- remove normalize-space() if you want keep white-space at it is -->
<xsl:value-of select="concat($quote, normalize-space(.), $quote)" />
<xsl:if test="following-sibling::*">
<xsl:value-of select="$delim" />
</xsl:if>
</xsl:template>
<xsl:template match="text()" />
</xsl:stylesheet>
XML元素被命名为Countries
,XSLT使用Countries
我还将明确处理元素和属性:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text" encoding="iso-8859-1"/>
<xsl:param name="delim" select="string(',')" />
<xsl:param name="quote" select="string('"')" />
<xsl:param name="break" select="string('
')" />
<xsl:template match="/">
<xsl:apply-templates select="results/Countries" />
</xsl:template>
<xsl:template match="Countries">
<xsl:apply-templates select="@*|*"/>
<xsl:if test="following-sibling::*">
<xsl:value-of select="$break" />
</xsl:if>
</xsl:template>
<xsl:template match="*">
<xsl:apply-templates select="@*"/>
<xsl:if test="*|following-sibling::*">
<xsl:value-of select="$delim" />
<xsl:apply-templates select="*"/>
</xsl:if>
</xsl:template>
<xsl:template match="@*">
<!-- remove normalize-space() if you want keep white-space at it is -->
<xsl:value-of select="concat($quote, normalize-space(.), $quote)" />
<xsl:if test="position() != last ()">
<xsl:value-of select="$delim" />
</xsl:if>
</xsl:template>
</xsl:stylesheet>
我无法理解样式表应该做什么EnableScript=true
也没有意义。试试这个:
string folderPath = @"path\to\your\folder";
using (XmlReader reader = XmlReader.Create(Path.Combine(folderPath, "listOfCities.xml")))
using (TextWriter writer = File.CreateText(Path.Combine(folderPath, "myCities.csv")))
{
var xslt = new XslCompiledTransform();
xslt.Load(Path.Combine(folderPath, "citiesCsv.xslt"));
xslt.Transform(reader, null, writer);
}
其中citiesCsv.xslt是:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text"/>
<xsl:template match="/">
<xsl:for-each select="//Countries">
<xsl:value-of
select="@country"/>,<xsl:value-of
select="Regions/@region"/>,<xsl:value-of
select="Regions/Provinces/@province"/>,<xsl:value-of
select="Regions/Provinces/Cities/@city"/>
<xsl:text> </xsl:text>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
,,,
看起来您使用了错误的字符集。这是一个很好的链接,您应该真正阅读:
正如标题所说,这是“每个软件开发人员绝对、绝对必须了解Unicode和字符集的最低要求(没有借口!)”输入xml(或xslt)可能以Unicode的字节顺序标记开始,c#解析得很糟糕(我找不到明显的原因)
在某个hexeditor中打开它,查看前3个字节,然后删除它们。我想这就是你的本意。我建议您研究Dour High Arch的xslt建议。这会让事情变得更干净一点
C#代码
xsltfile1.xslt
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text" encoding="iso-8859-1"/>
<xsl:param name="delim" select="string(',')" />
<xsl:param name="quote" select="string('"')" />
<xsl:param name="break" select="string('
')" />
<xsl:template match="/">
<xsl:apply-templates select="results/Countries" />
</xsl:template>
<xsl:template match="Countries">
<xsl:apply-templates select="//@*" />
<xsl:if test="not(position()=last())">
<xsl:value-of select="$break" />
</xsl:if>
</xsl:template>
<xsl:template match="@*">
<xsl:value-of select="concat($quote, normalize-space(.), $quote)" />
<xsl:if test="not(position()=last())">
<xsl:value-of select="$delim" />
</xsl:if>
</xsl:template>
<xsl:template match="text()" />
</xsl:stylesheet>
输出编码设置为encoding=“iso-8859-1”,但不包含您提到的字符。例如,ď仅在iso-8859-2中定义
因此,我猜想问题是由编码不匹配引起的。在十六进制编辑器中查看生成的文件
我不确定该方法是否使用XSLT中给出的编码来编写文件
使用Transform()方法写入,并将生成的字符串保存到控制其编码的文件中。ďż似乎是UTF8文件在不支持UTF8的应用程序中开始使用的。您的Xml编写器正在输出unicode,但结果是ISO-8859-1(根据
打电话的时候
Transform(…)在代码中,使用重载Transform(String,XmlWriter)
并使用ISO-8859-1编码创建XmlWriter:
XmlWriterSettings settings = new XmlWriterSettings();
settings.Encoding = Encoding.UTF8;
XmlWriter writer = XmlWriter.Create("c:\myCities.csv",settings);
然后将其用于变换
XSLT.Transform(doc.OuterXml,writer);
不巧的是,这没有帮助也许,修改样式表会有帮助。您希望得到什么样的输出?奇怪。XML文件顶部的实际XML声明是什么样子的?您使用的是什么编辑器,您的XML文档是否按照声明的字符编码方式进行编码?只是想知道是否会出现一些奇怪的情况n如果您在文档中没有看到非标准字符,请记住阿尔巴尼亚语单词将带有变音符号(如umlauts)在它们中,xslcomiledtransform
中的Transform
方法采用XmlReader
、IXPathNavigable
,或包含xml文档URI的字符串。最后一行是否应为XSLT.Transform(@“c:\listOfCities.xml”、“c:\mycitilities.csv”)
?
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text" encoding="iso-8859-1"/>
<xsl:param name="delim" select="string(',')" />
<xsl:param name="quote" select="string('"')" />
<xsl:param name="break" select="string('
')" />
<xsl:template match="/">
<xsl:apply-templates select="results/Countries" />
</xsl:template>
<xsl:template match="Countries">
<xsl:apply-templates select="//@*" />
<xsl:if test="not(position()=last())">
<xsl:value-of select="$break" />
</xsl:if>
</xsl:template>
<xsl:template match="@*">
<xsl:value-of select="concat($quote, normalize-space(.), $quote)" />
<xsl:if test="not(position()=last())">
<xsl:value-of select="$delim" />
</xsl:if>
</xsl:template>
<xsl:template match="text()" />
</xsl:stylesheet>
"Albania","Centralna Albania","Durres i okolice","Durres","2B66E0ACFAEF78734E3AF1194BFA6F8DEC4C5760","1","0","2"
XmlWriterSettings settings = new XmlWriterSettings();
settings.Encoding = Encoding.UTF8;
XmlWriter writer = XmlWriter.Create("c:\myCities.csv",settings);
XSLT.Transform(doc.OuterXml,writer);