Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >为了测试这是否是第一个sect1子元素,我如何优化XPath测试not(previous-sect1::Sect1)?

为了测试这是否是第一个sect1子元素,我如何优化XPath测试not(previous-sect1::Sect1)?
EN

Stack Overflow用户
提问于 2010-08-27 13:32:50
回答 3查看 636关注 0票数 1

我正在开发一个XSLT1.0样式表(并使用xsltproc应用它)。我的脚本中的一个模板应该对给定父节点中的第一个<sect1>元素和最后一个<sect1>元素执行一些特殊处理。现在这个特殊的处理是这样实现的:

代码语言:javascript
运行
AI代码解释
复制
<xsl:template match="sect1">
  <xsl:if test="not(preceding-sibling::sect1)">
    <!-- Special handling for first sect1 element goes here. -->
  </xsl:if>
  <!-- Common handling for all sect1 elements goes here. -->
  <xsl:if test="not(following-sibling::sect1)">
    <!-- Special handling for last sect1 element goes here. -->
  </xsl:if>
</xsl:template>

我想知道(只是出于好奇,脚本的运行速度对我来说很好):有没有更有效的方法来做到这一点?在找到第一个匹配项之后,XSLT处理器是否可能会停止组装preceding-sibling::sect1节点集,因为它知道只需要找到一个或零个元素?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2010-09-04 03:56:48

处理器是否会在找到第一个匹配项后停止组装之前的兄弟::Sect1节点集,因为它知道它只需要找到一个或零个元素?

我不知道xsltproc,但是Saxon非常擅长这些优化。我相信它只会检查第一个找到的匹配项,因为它只需要知道节点集是否为空。

但是,您始终可以通过如下更改测试来确保:

代码语言:javascript
运行
AI代码解释
复制
  <xsl:if test="not(preceding-sibling::sect1[1])">

代码语言:javascript
运行
AI代码解释
复制
  <xsl:if test="not(following-sibling::sect1[1])">

因为这将只测试每个轴上的第一个同级。请注意,每种情况下的1都是指XPath步骤的顺序,这是轴的顺序,不一定是文档顺序。因此,preceding-sibling::sect1[1]引用的是紧挨着当前元素的sect1同级元素,而不是文档顺序中的第一个sect1同级元素。因为preceding-sibling轴的方向是相反的。

票数 1
EN

Stack Overflow用户

发布于 2010-08-27 13:52:03

假设在其中调用模板的上下文是一个子节点选择,那么我将提供以下内容。如果它们被调用的上下文是通过一个不同的轴(比如前面的兄弟或祖先),那么处理它的方法就是最好的。

两种可能性是简化测试,或者用不同的模板替换它们:

更简单的测试:

代码语言:javascript
运行
AI代码解释
复制
<xsl:template match="sect1">
  <xsl:if test="position() = 1">
    <!-- Special handling for first sect1 element goes here. -->
  </xsl:if>
  <!-- Common handling for all sect1 elements goes here. -->
  <xsl:if test="position() = last()">
    <!-- Special handling for last sect1 element goes here. -->
  </xsl:if>
</xsl:template>

不同的模板:

代码语言:javascript
运行
AI代码解释
复制
<xsl:template name="handleSect1">
  <!-- Common handling for all sect1 elements goes here. -->
<xsl:template>
<xsl:template match="sect1">
  <xsl:call-template name="handleSect1"/>
</xsl:template>
<xsl:template match="sect1[1]">
  <!-- Special handling for first sect1 element goes here. -->
  <xsl:call-template name="handleSect1"/>
</xsl:template>
<xsl:template match="sect1[last()]">
  <xsl:call-template name="handleSect1"/>
  <!-- Special handling for last sect1 element goes here. -->
</xsl:template>
<xsl:template match="sect1[position() = 1 and position() = last()]">
  <!-- Special handling for first sect1 element goes here. -->
  <xsl:call-template name="handleSect1"/>
  <!-- Special handling for last sect1 element goes here. -->
</xsl:template>

既然你说“优化”,我假设你关心的是哪一个会处理得更快。它将根据xslt处理器、处理模式(有些有一个“编译”选项,这将影响哪个更有效)和输入XML而有所不同。最快的可能是这两个或你原来的。

实际上,其中的每一个都应该是高效的,不同之处在于处理器设法进行的优化。

在这种情况下,我会倾向于第一个答案,因为它是最简洁的,但如果我不想在所有4个案例之间共享共同的处理,我会倾向于第二个答案中的方法,然后清楚地标记每个案例的不同方法。

票数 1
EN

Stack Overflow用户

发布于 2010-08-27 13:40:35

我认为你应该能够做到

代码语言:javascript
运行
AI代码解释
复制
  <xsl:if test="position() = 1">
    <!-- Special handling for first sect1 element goes here. -->
  </xsl:if>
  <!-- Common handling for all sect1 elements goes here. -->
  <xsl:if test="position() = last()">
    <!-- Special handling for last sect1 element goes here. -->
  </xsl:if>

因为position()last()是上下文敏感。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3584645

复制
相关文章
MyBatis框架动态查询Sql
今天写一个接口,查询监测数据,传感器有100多个监测因子,也就是数据库中一条数据对应100多个字段,前端勾选需要查询的监测因子,所以接口就需动态查询字段,幸运的是Mybatis支持这种查询
赵哥窟
2020/07/28
6010
Mybatis框架 动态字段查询数据
今天写一个接口,查询监测数据,传感器有100多个监测因子,也就是数据库中一条数据对应100多个字段,前端勾选需要查询的监测因子,所以接口就需动态查询字段,幸运的是Mybatis支持这种查询
赵哥窟
2020/07/09
1.7K0
C# 根据前台传入实体名称,动态查询数据
项目中时不时遇到查字典表等数据,只需要返回数据,不需要写其他业务,每个字典表可能都需要写一个接口给前端调用,比较麻烦,所以采用下面这种方式,前端只需传入实体名称即可,例如:SysUser
郑子铭
2023/08/29
3290
C# 根据前台传入实体名称,动态查询数据
PostgreSQL中的查询:1.查询执行阶段
PG客户端-服务协议的基本目的是双重的:将SQL查询发送到服务,接收整个执行结果作为响应。服务接收到查询去执行要经过几个阶段。
yzsDBA
2022/03/29
3.3K0
PostgreSQL中的查询:1.查询执行阶段
实体中时间类型LocalDateTime,查询的时候mybatis报错
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/149340.html原文链接:https://javaforall.cn
全栈程序员站长
2022/07/04
7190
Spring框架中的异步执行
在Spring Framework中分别使用TaskExecutor和TaskScheduler接口提供异步执行和任务调度的抽象,本节我们着重讲解基于TaskExecutor支撑的的注解@Async如何实现异步处理的。
Bug开发工程师
2019/12/31
8490
kettle中实现动态SQL查询
在ETL项目中,通常有根据运行时输入参数去执行一些SQL语句,如查询数据。本文通过kettle中的表输入(“table input”)步骤来说明动态查询、参数查询。示例代码使用内存数据库(H2),下载就可以直接运行,通过示例学习更轻松。
全栈程序员站长
2022/09/09
5.8K0
kettle中实现动态SQL查询
Spring框架中动态代理
在上一篇中我们已经介绍了AOP相关的知识,并且了解了spring是通过动态代理的方式实现AOP逻辑的。在spring中动态代理也分为两种一种是JDK动态代理,一种是CGLib动态代理。下面我们看一下这两种动态代理的区别。我们首先看一下在没有动态代理时,添加事物的的逻辑处理,也就上一篇中的事例。
吉林乌拉
2019/08/14
1.7K0
Springboot中对jpa动态查询条件的封装
jpa对于固定参数的条件查询比较简单,可以在Repository中直接用参数名来查询。但是对于不固定的参数查询就比较麻烦了,官方提供的是继承JpaSpecificationExecutor,然后自己拼接Specification。这一篇主要是对Specification进行封装,让写法更友好. 代码参考:http://lee1177.iteye.com/blog/1994295。感觉还不够完整,回头使用中再补上。
天涯泪小武
2019/01/17
2.8K0
使用sp_executesql存储过程执行动态SQL查询
The sp_executesql stored procedure is used to execute dynamic SQL queries in SQL Server. A dynamic SQL query is a query in string format. There are several scenarios where you have an SQL query in the form of a string.
全栈程序员站长
2022/08/31
1.9K0
使用sp_executesql存储过程执行动态SQL查询
利用动态 tracing 技术来 trace 内核中的网络请求
这周帮朋友用 eBPF/SystemTap 这样的动态 tracing 工具做了一些很有趣的功能。这篇文章算是一个总结
青南
2021/06/23
1.9K0
利用动态 tracing 技术来 trace 内核中的网络请求
Java中的动态代理以及在框架中的应用
我们先假设现在有怎么一个需求,要求你在不改动原有代码的情况下在所有类的方法前后打印日志。我们很容易想到静态代理,具体做法如下:
烂猪皮
2021/06/09
1.4K0
Java中的动态代理以及在框架中的应用
MySQL 查询执行的过程
查询的生命周期大致可以按照顺序来看:从客户端到服务端,然后在服务器上进行解析,生成执行计划,执行,并返回结果给客户端。其中 “执行” 可以认为是整个生命周期中最重要的阶段,其中包括了大量为了检索数据到存储引擎的调用以及调用后的数据处理,包括排序分组等。当希望 MySQL 能够以高性能的方式运行查询时,最好的办法就是弄清楚 MySQL 是如何优化和执行查询的。MySQL 执行一个查询的过程,如下:
Java架构师必看
2021/05/14
2.3K0
MySQL 查询执行的过程
Oracle——无法在查询中执行 DML 操作
create or replace function test_f(id varchar2) return varchar2 is Result varchar2(100); begin insert into sfcs_temp_17109 (sn)values(id);
_一级菜鸟
2019/09/10
4.5K0
Oracle——无法在查询中执行 DML 操作
Rafy 领域实体框架设计 - 重构 ORM 中的 Sql 生成
前言 Rafy 领域实体框架作为一个使用领域驱动设计作为指导思想的开发框架,必然要处理领域实体到数据库表之间的映射,即包含了 ORM 的功能。由于在 09 年最初设计时,ORM 部分的设计并不是最重要的部分,那里 Rafy 的核心是产品线工程、模型驱动开发、界面生成等。所以当时,我们简单地采用了一个开源的小型 ORM 框架:《Lite ORM Library》。这个 ORM 框架可以生成比较简单的 Sql 语句,以处理一般性的情况。 随着不断使用,我们也不断对 ORM 的源码做了不少改动,让它在支持简单
用户1172223
2018/01/26
2.1K0
执行&查询引擎
Hive支持使用Spark作为底层执行引擎,以获得比MapReduce更快的处理性能。
十里桃花舞丶
2021/09/10
4130
PostgreSQL查询当前执行中SQL的执行计划——pg_show_plans
如果同样的SQL要执行很多遍,且每次都是同样的执行计划、每次都发生硬解析,则会消耗大量时间。类似于Oracle存放执行计划的library cache,PG也有一个类似的概念——plan_cache。但实际上,PG提供的是预备语言(preparedstatement),它要求应用给这个语句进行标识后,再通过这个标识请求服务端执行,并且由应用负责回收。
数据和云
2021/08/27
3K0
PostgreSQL查询当前执行中SQL的执行计划——pg_show_plans
MySQL查询执行的过程
当我们希望MySQL能够以更高的性能进行查询时,弄清楚MySQL中是如何优化和执行查询的就显得很有必要,这里,先搬出来一张图镇楼:
AsiaYe
2019/11/06
2.1K0
MySQL查询执行的基础
当我们希望MySQL能够以更高的性能运行查询时,最好的办法就是弄清楚MySQL是如何优化和执行查询的。一旦理解了这一点,很多查询优化工作实际上就是遵循一些原则让优化器能够按照预想的合理方式运行
星哥玩云
2022/08/17
1.4K0
MySQL查询执行的基础
记录ci框架中定时任务的执行[通俗易懂]
1.控制器中方法的确定,我的控制器/方法:v3/Facesecret/horoscopearticle;确保在Postman中可以成功执行
全栈程序员站长
2022/07/11
1K0
记录ci框架中定时任务的执行[通俗易懂]

相似问题

从HTTP报头复制Post操作

11

如何设置HTTP报头

12

HTTP报头

50

如何重新排序HTTP报头?

10

AngularJS: Http报头

10
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档