首页 > 解决方案 > 使用 XSLT 查找日期是否在日期范围内

问题描述

我有以下xml:

<?xml version="1.0" encoding="UTF-8"?>
<divisions>
   <userProvidedEffDate>12/31/2002</userProvidedEffDate>
   <division>
      <GroupNumber>001</GroupNumber>
      <GroupEffDt>01/01/2000</GroupEffDt>
      <GroupExpDt>12/31/9999</GroupExpDt>
   </division>
   <division>
      <GroupNumber>002</GroupNumber>
      <GroupEffDt>01/01/2000</GroupEffDt>
      <GroupExpDt>12/31/2001</GroupExpDt>
   </division>
</divisions>

现在我想使用 XSLT 1.0 基于<userProvidedEffDate>. 如果<userProvidedEffDate>介于<division>'s <GroupEffDt><GroupExpDt>(含)的日期范围内,则显示该除法。例如,上面的输入 xml 应该根据<userProvidedEffDate>值 12/31/2002 转换如下。

<?xml version="1.0" encoding="UTF-8"?>
<divisions>
   <userProvidedEffDate>12/31/2002</userProvidedEffDate>
   <division>
      <GroupNumber>001</GroupNumber>
      <GroupEffDt>01/01/2000</GroupEffDt>
      <GroupExpDt>12/31/9999</GroupExpDt>
   </division>
</divisions>

任何帮助表示赞赏。

标签: xslt

解决方案


作为为什么切换到 Saxon 9 的示例,如果必须在 XSLT 1.0 中执行此操作(没有任何扩展函数),则必须将日期转换为 YYYYMMDD 形式的数字。

例如

<xsl:variable name="userProvidedEffDate" select="number(concat(substring(userProvidedEffDate, 7, 4), substring(userProvidedEffDate, 1, 2), substring(userProvidedEffDate, 4, 2)))" />

试试这个 XSLT

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
  <xsl:output method="xml" indent="yes" />

  <xsl:template match="@*|node()">
    <xsl:copy>
      <xsl:apply-templates select="@*|node()" />
    </xsl:copy>
  </xsl:template>

  <xsl:template match="divisions">
    <xsl:variable name="userProvidedEffDate" select="number(concat(substring(userProvidedEffDate, 7, 4), substring(userProvidedEffDate, 1, 2), substring(userProvidedEffDate, 4, 2)))" />
    <xsl:copy>
      <xsl:apply-templates select="@*|userProvidedEffDate" />
      <xsl:apply-templates select="division
                                     [number(concat(substring(GroupEffDt, 7, 4), substring(GroupEffDt, 1, 2), substring(GroupEffDt, 4, 2))) &lt;= $userProvidedEffDate
                                      and number(concat(substring(GroupExpDt, 7, 4), substring(GroupExpDt, 1, 2), substring(GroupExpDt, 4, 2))) &gt;= $userProvidedEffDate]" />
    </xsl:copy>
  </xsl:template>
</xsl:stylesheet>

当然,如果您可以控制 XML,一个简单的解决方案是首先在 XML 中使用 YYYYMMDD 格式的日期


推荐阅读