C# 4.0 XSLT如何应用于外部CSV文件?
我有一些代码加载到xml文件中,并使用“XslCompiledTransform”对其应用XSLT。我现在需要更改代码,因为输入文件可能不是XML,也可能是CSV文件。我有一个XSLT,可以将CSV转换为我想要的格式,但它使用硬编码路径。我的问题是,输入文件名将更改,因此我可以在名称中使用widecard吗?第二,在代码中,我是否可以将文件作为字符串传递给XSLT对象,并将结果放在底部?我一直在谷歌上搜索,没有找到任何代码来做这件事。有可能吗 这是我正在使用的XSLT。不是硬编码的路径和文件名C# 4.0 XSLT如何应用于外部CSV文件?,c#-4.0,xslt,C# 4.0,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, '
')" 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。谢谢你的帮助。据我所知,萨克森会为我工作的。感谢您张贴图书馆的名称和您的建议。