输出 XSLT 中条件匹配位置之前的一个节点

Posted

技术标签:

【中文标题】输出 XSLT 中条件匹配位置之前的一个节点【英文标题】:Output one node previous to where condition matches in XSLT 【发布时间】:2021-03-08 09:52:35 【问题描述】:

我有一个xml格式

<Session>
 <Record>
  <Y_threshold>85</Y_threshold>

   <XYData>
    <X>200</X>
    <Y>83.5</Y>
   </XYData>
 
   <XYData>
     <X>224</X>
     <Y>84.1</Y>
   </XYData>
            
   <XYData>
     <X>250</X>
     <Y>86.2</Y>
   </XYData>
            
   <XYData>
     <X>282</X>
     <Y>88.3</Y>
   </XYData>
            
   <XYData>
     <X>315</X>
     <Y>90.2</Y>
   </XYData>

 </Record>

 <Record>
  <Y_threshold>90</Y_threshold>

  <XYData>
     <X>200</X>
     <Y>88</Y>
  </XYData>
 
  <XYData>
     <X>224</X>
     <Y>88.5</Y>
  </XYData>
            
  <XYData>
     <X>250</X>
     <Y>89.1</Y>
  </XYData>
            
  <XYData>
     <X>282</X>
     <Y>91.7</Y>
  </XYData>
            
  <XYData>
     <X>315</X>
     <Y>94.5</Y>
   </XYData>

   </Record>
</Session>

对于每条记录,我需要获取满足 Y 大于 Y_threshold 的 FIRST 节点之前的节点的 X 值。

澄清,以防我措辞奇怪

在上面的例子中,满足 Y>Y_threshold 的第一个节点是

Record 1
<X>250</X>
<Y>86.2</Y>
(since 86.2 > 85)

Record 2
<X>282</X>
<Y>91.7</Y>
(since 91.7>90)

所以想要的输出是previous X,即一个节点before条件满足

Record 1
 <X>224</X>

Record 2
<X>250</X>

问题:如何使用 XSLT 2.0 或 1.0 做到这一点?

【问题讨论】:

找到第一个满足条件的节点,然后是它的前一个兄弟节点。 是的,但是怎么做?我是xslt的新手,你能拼出来吗?对不起 对不起,我还不能实现它,但谢谢你的回答 【参考方案1】:

这是一个在 XPath 中相当简单的练习。从Record的上下文中,选择:

XYData[Y > ../Y_threshold][1]/preceding-sibling::XYData[1]/X

【讨论】:

以上是关于输出 XSLT 中条件匹配位置之前的一个节点的主要内容,如果未能解决你的问题,请参考以下文章

left join on 和where中条件的放置位置

xslt 通过子节点和位置选择 rss 项目

使用 XSLT 基于 ID 从多个 xPath 中选择 XML 节点

打印与日志文件中条件匹配的数据

ms access 数据库中条件表达式异常中的数据类型不匹配

选择查询 C# 查询中条件表达式中的数据类型不匹配错误