使用 XSLT 设置 XML 属性值的日期格式



我在尝试执行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"&#10;</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>&#10;</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)"/>

最新更新