Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/csharp-4.0/2.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# 4.0 XSLT如何应用于外部CSV文件?_C# 4.0_Xslt - Fatal编程技术网

C# 4.0 XSLT如何应用于外部CSV文件?

C# 4.0 XSLT如何应用于外部CSV文件?,c#-4.0,xslt,C# 4.0,Xslt,我有一些代码加载到xml文件中,并使用“XslCompiledTransform”对其应用XSLT。我现在需要更改代码,因为输入文件可能不是XML,也可能是CSV文件。我有一个XSLT,可以将CSV转换为我想要的格式,但它使用硬编码路径。我的问题是,输入文件名将更改,因此我可以在名称中使用widecard吗?第二,在代码中,我是否可以将文件作为字符串传递给XSLT对象,并将结果放在底部?我一直在谷歌上搜索,没有找到任何代码来做这件事。有可能吗 这是我正在使用的XSLT。不是硬编码的路径和文件名

我有一些代码加载到xml文件中,并使用“XslCompiledTransform”对其应用XSLT。我现在需要更改代码,因为输入文件可能不是XML,也可能是CSV文件。我有一个XSLT,可以将CSV转换为我想要的格式,但它使用硬编码路径。我的问题是,输入文件名将更改,因此我可以在名称中使用widecard吗?第二,在代码中,我是否可以将文件作为字符串传递给XSLT对象,并将结果放在底部?我一直在谷歌上搜索,没有找到任何代码来做这件事。有可能吗

这是我正在使用的XSLT。不是硬编码的路径和文件名

<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:/Downloads/inputcsv.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>

找不到:

好的XSLT CompiledTransform是XSLT 1.0处理器,因此在XSLT CompiledTransform中不可能使用XSLT 2.0的功能,如
未解析文本
,您需要在XSLT 2.0中使用Saxon 9或XmlPrime或AltovaXML


然后,您可以将参数传递到发布的样式表中,因为它具有名为
pathtosv
的全局
xsl:param
,传递该参数的方式取决于要使用的XSLT处理器的API(或者如果您只想从命令行执行样式表,则取决于其命令行参数).

我需要在代码中使用XSLT 1.0来实现这一点,所以不是从命令行。xslcomiledtransform命令希望获取XML源,但我希望它使用xslt文件中定义的CSV文件。使用这个命令可以吗?正如Martin告诉您的,您的代码完全依赖于使用XSLT2.0。如果您想坚持使用XSLT1.0,您必须了解如何实现自己的扩展。但是,除了Microsoft以外的其他公司对.NET上的XSLT2.0有很好的支持。是的,我正在下载Saxon。谢谢你的帮助。据我所知,萨克森会为我工作的。感谢您张贴图书馆的名称和您的建议。