XSL运算符与筛选语法详解及数据提取实例
XSL/XPath提供了丰富的路径查找与数据过滤手段。掌握表意清晰的运算符与内置比较符号,能够高效从复杂嵌套的XML文档中精准定位目标节点并进行格式化输出。
核心导航与特殊字符
在构建XSL模板时,正确解析路径是处理数据的第一步。下表梳理了常用的元素访问标识及其作用范围:
/:选择子元素,返回左侧元素的直接子节点;位于最左侧时表示从根节点开始匹配。//:递归下降操作符。无论层级多深,均可搜索指定的元素;置于最左端表示从根节点出发向下全量检索。.:代表当前所在的上下文节点(当前元素)。*:通配符,用于匹配任意名字的元素。@:属性前缀,用于选取元素的特定属性值(如@id)。@*:通配符,匹配任意名称的属性。::命名空间分隔符,用于隔离前缀定义与具体的元素或属性名。
逻辑与关系比较运算符
XSL不仅支持基础的路径跳转,还允许通过逻辑表达式和数值对比来对数据进行二次过滤。常见的布尔判定方式如下:
and/&&:逻辑“与”,要求两侧条件同时成立。or/||:逻辑“或”,满足任一条件即成立。not():逻辑“非”,取反指定条件的结果。
在进行数据清洗或排序前,常需使用不等式进行大小比对。由于HTML解析器可能对部分符号转义敏感,以下列出了标准符号与其文本形式对照表:
- 基础比较: 使用
=(或$eq$) 判定相等,用!=(或$ne$) 判定不等。若涉及字符串比较且无需区分大小写,分别使用$ieq$与$ine$。 - 大小关系: 小于 (
<或$lt$)、大于 (>或$gt$)。如需忽略大小写执行此比较,请使用对应的$ilt$和$igt$变体。同理可延伸出小于等于 ($le$/$ile$) 与大于等于 ($ge$/$ige$) 的操作。
第1步:利用集合函数实现复杂筛选
在真实业务场景下,XML节点往往存在一对多的嵌套结构。例如,一个简历节点可能包含多项独立的技能标签。
$all$:当且仅当集合中所有项目均满足判定条件时,返回真。$any$:只要集合中存在任意一项项目满足条件,即返回真。|:返回两个集合数据的并集。[]:应用过滤样式或指定下标索引。
基于XML的实战提取案例
假设存在一份个人简历数据库结构如下(每个resume节点内有多条skill记录):
<document>
<resume>
<name>姓名</name>
<E-Mail>邮箱</E-Mail>
<birthday>生日(yyyy/mm/dd)</birthday>
<skill>WEB开发</skill>
<skill>Photoshop</skill>
</resume>
</document>
示例一:按特定技能匹配人员信息
目标:获取所有具备"WEB开发"技能候选人的姓名及邮件地址。
<TABLE border="1">
<TH>姓名</TH><TH>E-Mail</TH>
<xsl:for-each select="resume[$any$skill='WEB开发']">
<TR>
<TD><xsl:value-of select="name"/></TD>
<TD><xsl:value-of select="E-Mail"/></TD>
</TR>
</xsl:for-each>
</TABLE>
核心说明:
[]括号内即为过滤器。使用$any$确保即便该候选人掌握多项技能,只要其中有一项命中目标,该简历整体便会被纳入展示范围。示例二:基于日期区间筛选并合并输出技能清单
目标:找出1977年1月1日之前出生的求职者,展示其基本信息及全部已学技能。
<TABLE border="1" cellspacing="0">
<TH>姓名</TH><TH>技能列表</TH><TH>E-Mail</TH>
<xsl:for-each select="resume[birthday $lt$ '1977/1/1']">
<TR>
<TD><xsl:value-of select="name"/></TD>
<TD>
<xsl:value-of select="skill[0]"/>
<xsl:for-each select="skill[index()>0]">
、<xsl:value-of select="."/>
</xsl:for-each>
</TD>
<TD><xsl:value-of select="E-Mail"/></TD>
</TR>
</xsl:for-each>
</TABLE>
步骤拆解:
- 主节点过滤:
birthday $lt$ '1977/1/1'利用文本符号完成日期大小比对。 - 首项提取:
skill[0]负责显示第一条技能记录。 - 后续循环拼接:
skill[index()>0]遍历除第一项以外的其余技能,通过插入顿号连接成串。
以上就是XSL运算符与筛选语法的详细内容,更多关于XML数据处理及模板编写的资料请关注本站其它相关文章!
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









