【问题标题】:Parse XSL Date Format解析 XSL 日期格式
【发布时间】:2014-12-29 19:31:35
【问题描述】:

我正在制作一个 XSL 样式表来格式化 Shopify 输出的 XML 日期。

输出的是什么;

<created-at type="dateTime">2014-12-23T14:27:53-05:00</created-at>

我需要调整它看起来像

<created-at type="dateTime">2014-12-23 14:27:53</created-at>

我只是不确定如何删除“T”或在末尾剪掉时区戳。

有什么建议吗?

当前 XSL 样式表(订单日期是我要调整的);

<xsl:template match="order">
    <html>
        <head>
            <title>St. Baldrick's Order #<xsl:value-of select="order-number" /></title>
        </head>
        <body>
            <p>
                Order Number: <xsl:value-of select="order-number" /><br /><!-- Their Order Number -->
                Client ID: <xsl:value-of select="id" /><br /><!-- Internal Compass ID or Customer Account Number -->
                First Name: <xsl:value-of select="first-name" /><br /><!-- Ship-to first name -->
                Last Name: <xsl:value-of select="last-name" /><br /><!-- Ship-to last name -->
                Order Date: <xsl:value-of select="created-at" /><br /><!-- Order Date -->
            </p>
        </body>
    </html>
</xsl:template>

【问题讨论】:

  • 请出示您当前的 XLST 样式表。只有这样,我们才能为您提供立即有用的答案。
  • @MathiasMüller 我已经用 XSLT 更新了

标签: xml xslt xml-parsing shopify xml-formatting


【解决方案1】:

一种方法是,作为匹配完整节点的示例

<xsl:template match="created-at">
  <xsl:copy>
   <xsl:attribute name="type" select="@type"/>
     <xsl:value-of select="substring(translate(.,'T', ' '),1,string-length()-6)"/>
  </xsl:copy>
</xsl:template>

结果:&lt;created-at type="dateTime"&gt;2014-12-23 14:27:53&lt;/created-at&gt;

这会将 T 替换为使用 translate() 的空格,并使用 substring() 删除最后 6 个字符。

更新: 如评论中所述,如果日期始终采用 hh:mm:ss 格式,则可以删除 substring() 中的 string-length() 并简化选择表达式给&lt;xsl:value-of select="substring(translate(.,'T', ' '),1,19)"/&gt;

对于刚刚添加的匹配order的原始模板:如果你只是改变它应该可以工作:

Order Date: <xsl:value-of select="created-at" />

进入这个:

Order Date: <xsl:value-of select="substring(translate(created-at,'T', ' '),1,19)" />

【讨论】:

  • 1. 字符串中没有0 位置;第一个字符在位置12. 假设时间为 hh:mm:ss 格式,您可以将表达式简化为substring(translate(., 'T', ' '), 1, 19)
  • @michael.hor257k 感谢您的建议,已更新。关于 1.,奇怪的是它在我测试的 xslt 处理器上工作。
  • 我尝试在&lt;xsl:template match="order"&gt; 之前和之后添加它,并在&lt;xsl:value-of select="created-at" /&gt; 的地方添加,但无济于事。我做错了吗@matthias_h?
  • @Newcombe 我刚刚更新了我的答案,之前的答案只是一个匹配单个 created-at 元素的示例,因此可以使用 select 中的 created-at 而不是 created-at .,因为它是当前节点。
  • 即使是负数也能“工作”——但这并不意味着什么。
猜你喜欢
  • 2021-11-10
  • 2018-08-06
  • 1970-01-01
  • 1970-01-01
  • 2023-01-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多