2012-08-31 56 views
0

我有以下測試代碼,試圖將CVS文件轉換爲XML。我的問題是,有時它會運行,它失敗,出現以下錯誤其他時間:SAXON XSLT錯誤

The specified node cannot be inserted as the valid child of this node, because the specified node is the wrong type. 

下面是代碼:

 XsltCompiler compiler = null; 
     try 
     { 
      Processor processor = new Processor(); 
      compiler = processor.NewXsltCompiler(); 

      var sr = new StreamReader(@"c:\files\drop\csv-to-xml_v2.xslt"); 
      var xslt = sr.ReadToEnd(); 
      sr.Close(); 

      StringReader reader = new StringReader(xslt); 

      XsltExecutable exec = compiler.Compile(reader); 

      XsltTransformer transformer = exec.Load(); 

      transformer.InitialTemplate = new QName("", "main"); 

      var XmlResult = new DomDestination(); 

      transformer.Run(XmlResult); 

      reader.Close(); 
     } 
     catch (Exception ex) 
     { 
      var errMsg = ex.Message; 
      var errList = compiler != null ? compiler.ErrorList : null; 
     } 

的XSLT是:

<?xml version="1.0"?> 

<xsl:stylesheet version="2.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns:xs="http://www.w3.org/2001/XMLSchema" 
xmlns:fn="fn" 
exclude-result-prefixes="xs fn"> 

<xsl:output indent="yes" encoding="US-ASCII"/> 

<xsl:param name="pathToCSV" select="'file:///C:/Files/Drop/inputcsv1.csv'"/> 

<xsl:function name="fn:getTokens" as="xs:string+"> 
<xsl:param name="str" as="xs:string"/> 
    <xsl:analyze-string select="concat($str, ',')" regex='(("[^"]*")+|[^,]*),'> 
     <xsl:matching-substring> 
      <xsl:sequence select='replace(regex-group(1), "^""|""$|("")""", "$1")'/> 
     </xsl:matching-substring> 
    </xsl:analyze-string> 
</xsl:function> 

<xsl:template match="/" name="main"> 
<xsl:choose> 
    <xsl:when test="unparsed-text-available($pathToCSV)"> 
     <xsl:variable name="csv" select="unparsed-text($pathToCSV)"/> 
     <xsl:variable name="lines" select="tokenize($csv, '&#xD;')" as="xs:string+"/> 
     <xsl:variable name="elemNames" select="fn:getTokens($lines[1])" as="xs:string+"/> 
     <root> 
      <xsl:for-each select="$lines[position() > 0]"> 
       <row> 
        <xsl:variable name="lineItems" select="fn:getTokens(.)" as="xs:string+"/> 

        <xsl:for-each select="$elemNames"> 
         <xsl:variable name="pos" select="position()"/> 
         <column> 
          <xsl:value-of select="$lineItems[$pos]"/> 
         </column> 
        </xsl:for-each> 
       </row> 
      </xsl:for-each> 
     </root> 
    </xsl:when> 
    <xsl:otherwise> 
     <xsl:text>Cannot locate : </xsl:text><xsl:value-of select="$pathToCSV"/> 
    </xsl:otherwise> 
</xsl:choose> 
</xsl:template> 

</xsl:stylesheet> 

任何人都可以看到爲什麼有時它的工作原理,然後沒有理由在「transformer.Run(XmlResult)」行失敗?我正在使用C#4,Visual Studio 2010和Saxon 9 HE。

回答

1

在「否則」分支中,您將創建一個文本節點作爲文檔節點的子節點。因爲你的目的地是一個DOM目的地,所以這是不允許的。 (它在XDM數據模型中是允許的,但是沒有辦法在DOM中表示它)。