gpt4 book ai didi

xml - 使用 XSLT 比较两个日期之间的日期

转载 作者:行者123 更新时间:2023-12-04 05:08:24 24 4
gpt4 key购买 nike

这是我的 xml

<?xml version="1.0" encoding="ISO-8859-1"?>
<?xml-stylesheet type="text/xsl" href="test.xsl"?>

<products>
<product_id value=" 1 ">
<tab_id value=" 51 ">
<tab_name value=" test1 "/>
<status value=" 2 "/>
<log value=" 5748 , 5749 , 128 "/>
<born_from value=" 1980-08-01 , 1989-02-01 "/>
<born_to value=" 1985-08-01 , 1998-02-01 "/>
<sex value=" 2 , 1 "/>
<link value=" www.google.com "/>
</tab_id>
</product_id>
<product_id value=" 2 ">
<tab_id value=" 52 ">
<tab_name value=" test2 "/>
<status value=" 3 "/>
<log value=" 458 , 912 , 333 "/>
<registration value=" 2013-01-01 "/>
<born_from value=" 1995-01-25 , 1993-08-03 "/>
<born_to value=" 2000-01-25 , 2002-10-25 "/>
<sex value=" 1 , 1 "/>
<link value=" www.yahoo.com "/>
<label value=" open "/>
</tab_id>
</product_id>
<product_id value=" 3 ">
<tab_id value=" 54 ">
<tab_name value=" test3 "/>
<status value=" start "/>
<venue value=" US "/>
<born_from value=" 2000-01-01 , 2002-02-01 "/>
<born_to value=" 2005-01-01 , 2003-01-01 "/>
<sex value=" 1 , 2 "/>
<link value=" www.facebook.com "/>
</tab_id>
</product_id>
</products>

我写了这个 XSLT 代码来显示产品的所有数据,其中 my_date变量将比较born_from 和born_to 的日期并给出产品1 和2 的输出数据
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="html" indent="yes"/>
<xsl:param name="my_date" select="'1992-01-01'"/>
<xsl:strip-space elements="*"/>

<xsl:template match="/products" priority="1">
<html>
<body>
<table border="1">
<tr>
<th>Product ID</th>
<th colspan="2">Product DATA</th>
</tr>
<xsl:apply-templates select="product_id/tab_id/born_from[@value &gt; $my_date] | product_id/tab_id/born_to[@value &lt; $my_date]"/>
</table>
</body>
</html>
</xsl:template>

<xsl:template match="product_id/tab_id">
<tr>
<td>
<xsl:value-of select="product_id"/>
</td>
<td><xsl:value-of select="name(*[1])"/> --></td>
<td><xsl:value-of select="*[1]/*[1]"/></td>
</tr>
<xsl:apply-templates select="*[not(self::product_id)]"/>
</xsl:template>

<!--These 2 templates will handle the data on the same
row as the tab name.-->
<xsl:template match="product_id/tab_id/*[1]" priority="1">
<xsl:apply-templates mode="newrow"/>
</xsl:template>
<xsl:template match="product_id/tab_id/*[1]/*[1]" mode="newrow"/>

<xsl:template match="*" mode="newrow">
<xsl:call-template name="dataRow"/>
</xsl:template>

<xsl:template match="product_id/tab_id/*/*[not(position()=1)]">
<xsl:call-template name="dataRow"/>
</xsl:template>

<xsl:template name="dataRow">
<tr>
<td/>
<td/>
<td><xsl:value-of select="."/></td>
</tr>
</xsl:template>

<xsl:template match="*[not(self::node)]">
<tr>
<td/>
<td><xsl:value-of select="name()"/> --></td>
<td><xsl:apply-templates/></td>
</tr>
</xsl:template>

</xsl:stylesheet>

我是初学者迄今为止比较有问题

只是 my_date会这样比较
 for product 1
1980-08-01 > my_date && my_date < 1985-08-01
1989-02-01 > my_date && my_date < 1998-02-01

for product 2
1995-01-25 > my_date && my_date < 2000-01-25
1993-08-03 > my_date && my_date < 2002-10-25

same for product 3

这里 my_date与第一个值然后第二个值进行比较等等..我认为这里的问题是逗号分隔值

我想要这样的输出
Product ID  |   Product DATA
--------------------------------
1 |product_id => 1
|tab_id => 51
|tab_name => test1
|status => 2
|log => 72
| 19
| 79
|born_from => 1980-08-01
| 1989-02-01
|born_to => 1985-08-01
| 1998-02-01
|sex => 2
| 1
|link => www.google.com

产品 2 与其值(value)相同
提前致谢

最佳答案

在谈论日期之前,应该注意您的 还有一个问题。 xsl:应用模板

<xsl:apply-templates select="product_id/tab_id/born_from[@value &gt; $my_date]" />

这将选择 Born_from 元素,但从您的匹配模板来看,您似乎想要实际选择 tab_id 元素,所以你必须像这样重写它:
<xsl:apply-templates select="product_id/tab_id[born_from/@value &gt; $my_date]" />

但是,正如评论中提到的,XSLT 1.0 中没有对日期的内置支持。您要么必须使用扩展功能,要么升级以使用 XSLT 2.0。

但是,如果您的日期总是采用 YYYY-MM-DD 格式,您可以通过删除连字符并将它们视为 8 位数字来进行简单的数字比较。

首先,创建一个变量来转换您的 my_date 参数转换成多个格式 YYYYMMDD
<xsl:variable name="comp_date" select="translate($my_date, '- ', '')" />

然后,尝试更改后续 xsl:应用模板对此。
<xsl:apply-templates select="
product_id/tab_id[translate(substring-before(born_from/@value, ','), '- ', '') &gt; $comp_date]|
product_id/tab_id[translate(substring-before(born_to/@value, ','), '- ', '') &lt; $comp_date]"/>

注意 的使用子串之前 仅提取 中逗号前的第一个日期@value 属性。如果您还想检查逗号后的日期,请使用 子串后 .

关于xml - 使用 XSLT 比较两个日期之间的日期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15217677/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com