gpt4 book ai didi

Xpath 查询和时间

转载 作者:行者123 更新时间:2023-12-03 16:04:09 25 4
gpt4 key购买 nike

嗨,这是我的 XML 文件的内容:

<?xml version="1.0" encoding="ISO-8859-1"?>
<mainNode>
<sub time="08:00">
<status id="2">On</status>
<status id="3">Off</status>
</sub>
<sub time="13:00">
<status id="4">On</status>
<status id="7">On</status>
</sub>
<sub time="16:00">
<status id="5">On</status>
<status id="6">On</status>
<status id="7">Off</status>
<status id="8">On</status>
</sub>
<sub time="20:00">
<status id="4">Off</status>
<status id="7">On</status>
</sub>
<sub time="23:59">
<status id="4">On</status>
<status id="7">On</status>
</sub>
</mainNode>

我的程序获取当前时间:
如果我得到 15.59,我必须检索下一个子时间(16.00)的所有状态 ID:

<sub time="16:00">
<status id="5">On</status>
<status id="6">On</status>
<status id="7">Off</status>
<status id="8">On</status>
</sub>

使用第二个 XPath 查询,我必须获取上一个子时间 (13.00) 的所有状态 ID。
怎么做?我知道 SQL,但我对 XPath 很陌生。如果有的话,我也接受重要的 XPath 资源的 url。谢谢!

最佳答案

这里有两个解决方案:

一、XPath 1.0

这是一对XPath 1.0表达式 选择所需的节点:

/*/*
[translate(@time, ':','')
>
translate('15:59',':','')
][1]

选择第一个 sub时间晚于 15:59 的节点.
/*/*
[translate(@time, ':','')
<
translate('15:59',':','')
][last()]

选择第一个sub节点早于 15:59 sub时间 .

我们可以将这些包含在 XSLT 转换中 并检查是否产生了真正想要的结果:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes"/>

<xsl:template match="/">
First time after 15:59:
<xsl:copy-of select=
"/*/*
[translate(@time, ':','')
>
translate('15:59',':','')
][1]
"/>

First time before 15:59:
<xsl:copy-of select=
"/*/*
[translate(@time, ':','')
&lt;
translate('15:59',':','')
][last()]
"/>
</xsl:template>
</xsl:stylesheet>

应用上述转换时 在最初提供的 XML 文档上:
<mainNode>
<sub time="08:00">
<status id="2">On</status>
<status id="3">Off</status>
</sub>
<sub time="13:00">
<status id="4">On</status>
<status id="7">On</status>
</sub>
<sub time="16:00">
<status id="5">On</status>
<status id="6">On</status>
<status id="7">Off</status>
<status id="8">On</status>
</sub>
<sub time="20:00">
<status id="4">Off</status>
<status id="7">On</status>
</sub>
<sub time="23:59">
<status id="4">On</status>
<status id="7">On</status>
</sub>
</mainNode>

产生想要的结果 :
  First time after 15:59: 


<sub time="16:00">
<status id="5">On</status>
<status id="6">On</status>
<status id="7">Off</status>
<status id="8">On</status>
</sub>

First time before 15:59:

<sub time="13:00">
<status id="4">On</status>
<status id="7">On</status>
</sub>

请注意以下:
  • XPath 的使用 translate() 功能 摆脱冒号
  • last() 的使用功能 在第二个表达式中
  • 无需将时间转换为秒比较前
  • 当用作 XML 文档(例如 XSLT 样式表, 的一部分时,< 运算符必须转义

  • 二、 XPath 2.0

    XPath 2.0我们可以使用以下两个表达式生成选择所需的节点:
    /*/*[xs:time(concat(@time,':00')) 
    gt
    xs:time('15:59:00')
    ][1]

    选择第一个 sub时间晚于 15:59 的节点.
    /*/*[xs:time(concat(@time,':00')) 
    lt
    xs:time('15:59:00')
    ][last()]

    选择第一个sub节点早于 15:59 sub时间 .

    我们可以将这些包含在 XSLT 2.0 转换中 并检查是否产生了真正想要的结果:
    <xsl:stylesheet version="2.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:xs="http://www.w3.org/2001/XMLSchema">
    <xsl:output omit-xml-declaration="yes"/>

    <xsl:template match="/">
    First time after 15:59:
    <xsl:copy-of select=
    "/*/*[xs:time(concat(@time,':00'))
    gt
    xs:time('15:59:00')
    ][1]
    "/>

    First time before 15:59:
    <xsl:copy-of select=
    "/*/*[xs:time(concat(@time,':00'))
    lt
    xs:time('15:59:00')
    ][last()]
    "/>
    </xsl:template>
    </xsl:stylesheet>

    应用上述转换时 在最初提供的 XML 文档(与第一个解决方案中相同)上,会产生相同的所需结果。

    请注意以下:
  • 在 XPath 2.0 xs:time 是 native 数据类型 .然而,为了构造一个 xs:time()根据 xml 文档中的值,我们必须将丢失的秒数部分连接到它们。
  • 在 XPath 2.0 xs:time值可以与“atomic-value comarison operators 进行比较如ltgt .
  • 关于Xpath 查询和时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/475923/

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