【问题标题】:IMPORTXML XPath_Query for Google SheetsGoogle 表格的 IMPORTXML XPath_Query
【发布时间】:2018-02-14 19:50:15
【问题描述】:

我正在使用 GoogleSheet 的 IMPORTXML 函数来检索一年前的每个日历日期的数据或数据可用的最接近的一年前日期。

这是数据样本 (full data source is here):

 <entry>
    <id>http://data.treasury.gov/Feed.svc/DailyTreasuryYieldCurveRateData(6794)</id>
    <title type="text"></title>
    <updated>2018-02-06T22:05:38Z</updated>
    <author>
      <name />
    </author>
    <link rel="edit" title="DailyTreasuryYieldCurveRateDatum" href="DailyTreasuryYieldCurveRateData(6794)" />
    <category term="TreasuryDataWarehouseModel.DailyTreasuryYieldCurveRateDatum" scheme="http://schemas.microsoft.com/ado/2007/08/dataservices/scheme" />
    <content type="application/xml">
      <m:properties>
        <d:Id m:type="Edm.Int32">6794</d:Id>
        <d:NEW_DATE m:type="Edm.DateTime">2017-02-24T00:00:00</d:NEW_DATE>
        <d:BC_1MONTH m:type="Edm.Double">0.4</d:BC_1MONTH>
        <d:BC_3MONTH m:type="Edm.Double">0.52</d:BC_3MONTH>
        <d:BC_6MONTH m:type="Edm.Double">0.65</d:BC_6MONTH>
        <d:BC_1YEAR m:type="Edm.Double">0.8</d:BC_1YEAR>
        <d:BC_2YEAR m:type="Edm.Double">1.12</d:BC_2YEAR>
        <d:BC_3YEAR m:type="Edm.Double">1.38</d:BC_3YEAR>
        <d:BC_5YEAR m:type="Edm.Double">1.8</d:BC_5YEAR>
        <d:BC_7YEAR m:type="Edm.Double">2.12</d:BC_7YEAR>
        <d:BC_10YEAR m:type="Edm.Double">2.31</d:BC_10YEAR>
        <d:BC_20YEAR m:type="Edm.Double">2.69</d:BC_20YEAR>
        <d:BC_30YEAR m:type="Edm.Double">2.95</d:BC_30YEAR>
        <d:BC_30YEARDISPLAY m:type="Edm.Double">2.95</d:BC_30YEARDISPLAY>
      </m:properties>
    </content>
  </entry>
  <entry>
    <id>http://data.treasury.gov/Feed.svc/DailyTreasuryYieldCurveRateData(6795)</id>
    <title type="text"></title>
    <updated>2018-02-06T22:05:38Z</updated>
    <author>
      <name />
    </author>
    <link rel="edit" title="DailyTreasuryYieldCurveRateDatum" href="DailyTreasuryYieldCurveRateData(6795)" />
    <category term="TreasuryDataWarehouseModel.DailyTreasuryYieldCurveRateDatum" scheme="http://schemas.microsoft.com/ado/2007/08/dataservices/scheme" />
    <content type="application/xml">
      <m:properties>
        <d:Id m:type="Edm.Int32">6795</d:Id>
        <d:NEW_DATE m:type="Edm.DateTime">2017-02-27T00:00:00</d:NEW_DATE>
        <d:BC_1MONTH m:type="Edm.Double">0.44</d:BC_1MONTH>
        <d:BC_3MONTH m:type="Edm.Double">0.5</d:BC_3MONTH>
        <d:BC_6MONTH m:type="Edm.Double">0.68</d:BC_6MONTH>
        <d:BC_1YEAR m:type="Edm.Double">0.81</d:BC_1YEAR>
        <d:BC_2YEAR m:type="Edm.Double">1.2</d:BC_2YEAR>
        <d:BC_3YEAR m:type="Edm.Double">1.46</d:BC_3YEAR>
        <d:BC_5YEAR m:type="Edm.Double">1.87</d:BC_5YEAR>
        <d:BC_7YEAR m:type="Edm.Double">2.18</d:BC_7YEAR>
        <d:BC_10YEAR m:type="Edm.Double">2.36</d:BC_10YEAR>
        <d:BC_20YEAR m:type="Edm.Double">2.72</d:BC_20YEAR>
        <d:BC_30YEAR m:type="Edm.Double">2.98</d:BC_30YEAR>
        <d:BC_30YEARDISPLAY m:type="Edm.Double">2.98</d:BC_30YEARDISPLAY>
      </m:properties>
    </content>
  </entry>
  <entry>

这是我目前用于检索 2017 年 2 月 27 日数据的 XPath 查询:

//*[local-name() = 'NEW_DATE'][text() = '2017-02-27T00:00:00']/..

这是显示的结果:

6795    2017-02-27T00:00:00 0.44    0.5 0.68    0.81    1.2 1.46    1.87    2.18    2.36    2.72    2.98    2.98

有没有办法:

  1. 检索显示的所有数据,除了“d:Id”元素(上面的“6795”) 和
  2. 如果搜索没有数据的日期(例如 2017 2 月 25 日将导致“#N/A”错误,因为查询不会返回缺失日期的任何内容),查询将默认为下一个可用的转发日期(例如 2017 年 2 月 27 日)?

我避免使用 IF 函数以减少 IMPORTXML 调用。

【问题讨论】:

    标签: xml xpath google-sheets xquery


    【解决方案1】:

    这个答案怎么样?

    关于你的第一个问题

    示例:

    =TRANSPOSE(IMPORTXML(A1, "//*[local-name() = 'NEW_DATE'][text() = '2017-02-27T00:00:00']/../*[local-name()!='Id']"))
    
    • “A1”是http://data.treasury.gov/feed.svc/DailyTreasuryYieldCurveRateData?$filter=year(NEW_DATE)%20eq%202017的网址。
    • 对于//*[local-name() = 'NEW_DATE'][text() = '2017-02-27T00:00:00']/..,检索到除&lt;d:Id m:type="Edm.Int32"&gt;6795&lt;/d:Id&gt; 之外的值。
    • 结果被转置,因为值被输出到行。

    结果:

    关于你的第二个问题

    使用=TRANSPOSE(IMPORTXML(A1, "//*[local-name() = 'NEW_DATE'][text() = '2017-02-25T00:00:00']/../*[local-name()!='Id']"))时,检索#N/A的结果。

    如果我误解了你的问题,我很抱歉。

    【讨论】:

    • 第一个问题的解决方案按预期工作。谢谢。第二个问题应该检索下一个可用日期;因此,在查询“2017-02-25T00:00:00”时,查询应该寻找下一个可用日期,即“2017-02-27T00:00:00”,而不是“#N/A”的结果。这可能吗?
    • @Catalyx 对于给您带来的不便和我糟糕的英语水平,我深表歉意。对于您的第二个问题,我认为使用函数可能很难实现。您可以使用=ARRAYFORMULA(IMPORTXML(A1, "//*[local-name() = 'NEW_DATE']")) 检索日期列表。如果这些数据可以被解析为日期,它可能会更近一步。我认为谷歌应用脚​​本可能适合这种情况。很抱歉,我无法回答您的 2 个问题之一。
    • 我找到了使用INDEXSORTMATCH 函数的解决方案。是的,它需要一些嵌套函数。我稍后会发布该解决方案。也许使用MINMAXPOSITION 会有所帮助。我不是 XPath 专家,也不确定 Google Sheets 是否支持 XPath 2.0,如果使用 IF-THEN-ELSE 声明,它可能会变得更容易。谢谢。
    • @Catalyx 感谢您提供更多信息。我很高兴你的问题得到了解决。我想等待你的帖子并从你的帖子中学习。也谢谢你。
    • 这是我的公式的简化版本:=TRANSPOSE(IMPORTXML(A1,CONCATENATE("//*[local-name() = 'NEW_DATE'][text() = '",INDEX(SORT(IMPORTXML(A1, "//*[local-name() = 'NEW_DATE']"),1,FALSE),MATCH(CONCATENATE(TEXT(TODAY()-365,"YYYY-MM-DD"),"T00:00:00'"),SORT(IMPORTXML(A1, "//*[local-name() = 'NEW_DATE']"),1,FALSE),-1)),"']/../*[local-name()! = 'Id']")))。不是很优雅,但可以按预期工作。我希望这也有帮助。谢谢。
    【解决方案2】:

    因为 Google 表格 (GS) 似乎仅与 XPath 1.0 兼容(其documentation 和产品论坛页面herehere 不确认或澄清截至该日期支持的版本),替代方法,例如 XPath 2.0 IF-THEN-ELSE 语句 cannot be used。相反,可以使用 GS 原生函数过滤所寻找的源 XML 数据。

    问题 1

    根据@Tanaike 提出的解决方案,检索一个元素的所有子节点,保存一个,可以使用 XPath“not”命令完成,即!,如下面应用于“NEW_DATE”的父元素并省略子元素“Id”。 TRANSPOSE 用于以柱状形式显示。 (A1 是问题中包含源 XML URL 的单元格。)

    =TRANSPOSE(IMPORTXML(A1, "//*[local-name() = 'NEW_DATE'][text() = '2017-02-25T00:00:00']/../*[local-name()!='Id']"))
    

    问题 2

    要搜索一年前的特定日期,如果该日期的数据丢失,检索最接近的远期日期将需要嵌套的 GS 函数首先使用上述公式检索“NEW_DATE”数据,然后是反向它的订单使用SORTMATCH 最接近的可用日期。然后在反向排序的元素上使用INDEX 函数来选择适当的日期。 CONCATENATETEXTTODAY 函数仅用于以与 XML 数据兼容的格式设置一年前的日期。公式如下。

    =TRANSPOSE(IMPORTXML(A1,CONCATENATE("//*[local-name() = 'NEW_DATE'][text() = '",INDEX(SORT(IMPORTXML(A1, "//*[local-name() = 'NEW_DATE']"),1,FALSE),MATCH(CONCATENATE(TEXT(TODAY()-365,"YYYY-MM-DD"),"T00:00:00"),SORT(IMPORTXML(A1, "//*[local-name() = 'NEW_DATE']"),1,FALSE),-1)),"']/../*[local-name()! = 'Id']")))

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-03-15
      • 1970-01-01
      • 1970-01-01
      • 2019-06-03
      • 1970-01-01
      • 1970-01-01
      • 2016-02-07
      • 1970-01-01
      相关资源
      最近更新 更多