我在尝试执行XSLT转换时遇到了问题。在整个项目中,我正在努力将 XML 文档转换为 CSV 文件以进行数据库上传。问题是 XML 以ISO8601格式 (YYYY-MM-DDT00:00:00( 将日期作为属性值发送,但要使数据库从 CSV 文件中获取它,我需要将其转换为 MM/DD/YYYY。
下面是一个 XML 示例:
<GetChanged>
<UserInformation>
<Column Name="id" Value="555555555"/>
<Column Name="name" Value="Kevin"/>
<Column Name="bday" Value="1990-01-01T00:00:00"/>
</UserInformation>
</GetChanged>
这是我尝试使用的 XSLT
:<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:csv="csv:csv">
<xsl:output method="text"/>
<xsl:template match="GetChanged">
<!-- header -->
<xsl:text>"id","name","bday" </xsl:text>
<!-- data rows -->
<xsl:for-each select="UserInformation">
<!-- data cells -->
<xsl:for-each select="Column[@Name='id']">
<xsl:text>"</xsl:text>
<xsl:value-of select="@Value"/>
<xsl:text>"</xsl:text>
</xsl:for-each>
<xsl:text>,</xsl:text>
<xsl:for-each select="Column[@Name='name']">
<xsl:text>"</xsl:text>
<xsl:value-of select="@Value"/>
<xsl:text>"</xsl:text>
</xsl:for-each>
<xsl:text>,</xsl:text>
<xsl:for-each select="Column[@Name='bday']">
<xsl:text>"</xsl:text>
<xsl:value-of select="format-date(@Value, '[M01]/[D01]/[Y0001]')"/>
<xsl:text>"</xsl:text>
</xsl:for-each>
<xsl:if test="position()!=last()">
<xsl:text>,</xsl:text>
</xsl:if>
<xsl:text> </xsl:text>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
但是,当我使用 Nokogiri 通过 Ruby 运行它时,我最终会收到一个错误:
运行时错误:运行时错误:元素值 XPath 评估未返回任何结果
关于我可以做些什么来适当地格式化此日期的想法?
提前感谢!
nokogiri 依赖于 XSLT 的libxslt
。
在 Nokogiri 1.6.0 及更高版本中,libxml2 和 libxslt 与 gem,但如果要使用系统版本:
(详情请看这里:https://github.com/sparklemotion/nokogiri(
libxslt
仅支持 XSLT-1.0
一个名为libxslt的单独库可用于实现XSLT-1.0 对于 libxml2
(详情见此处:http://xmlsoft.org/XSLT.html(
您可以使用如下解决方案来解决此问题:在 xslt 1.0 中将日期从 DD-MMM-YYYY 转换为 YYYYMMDD 格式
或者执行一些子字符串/连接,如下所述:在 XSLT/XML 中将日期显示为 DD-MM-YYYY
表示为YYYY-MM-DDT00:00:00
的值不是日期。尝试更改 :
<xsl:value-of select="format-date(@Value, '[M01]/[D01]/[Y0001]')"/>
自:
<xsl:value-of select="format-dateTime(@Value, '[M01]/[D01]/[Y0001]')"/>
请注意,这两个函数都需要 XSLT 2.0 处理器。如果您的处理器仅支持 XSLT 1.0,则可以使用字符串操作重新格式化日期:
<xsl:value-of select="substring(@Value, 6, 2)"/>
<xsl:text>/</xsl:text>
<xsl:value-of select="substring(@Value, 9, 2)"/>
<xsl:text>/</xsl:text>
<xsl:value-of select="substring(@Value, 1, 4)"/>