Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# XSLt.transform为我提供了&引用;_C#_Xml_Xslt_Csv - Fatal编程技术网

C# XSLt.transform为我提供了&引用;

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=

我有XML:

<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('&quot;')" />
  <xsl:param name="break" select="string('&#xD;')" />

  <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('&quot;')" /> 
  <xsl:param name="break" select="string('&#xD;')" /> 

  <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>&#13;&#10;</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('&quot;')" />
  <xsl:param name="break" select="string('&#xD;')" />

  <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('&quot;')" />
  <xsl:param name="break" select="string('&#xD;')" />

  <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);