文档章节

实验:关于XPath中的13个轴

北风其凉
 北风其凉
发布于 2015/02/08 21:38
字数 1588
阅读 1860
收藏 10
点赞 1
评论 0

XSLT使用XPath来找寻XML文档中的信息,这几天在学习XSLT的找寻路径过程中,我写了下面这个例子,来加深我对XPath中各个轴的概念的理解

测试用的XML文档和XSLT文档

XML文档:LogReport.xml

<?xml version="1.0" encoding="gb2312"?>
<?xml-stylesheet type='text/xsl' href='LogReport.xslt'?>
<LogReport CreateTime="2015/2/7 20:34:17">
  <Data>DataA</Data>
  <Data>DataB</Data>
  <Data>DataC</Data>
  <LogList ListName="XXX">
    <Log LogLevel="0" LogItem="Zhang" Description="Log1">
      <LogMessage Message="abcdefg" />
    </Log>
    <Log LogLevel="0" LogItem="Wang" Description="Log2">
      <LogMessage Message="hijklmn" />
    </Log>
    <Log LogLevel="1" LogItem="Lee" Description="Log3">
      <LogMessage Message="opqrst" />
    </Log>
    <Log LogLevel="1" LogItem="Zhao" Description="Log4">
      <LogMessage Message="uvwxyz" />
    </Log>
  </LogList>
  <Data>DataX</Data>
  <Data>DataY</Data>
  <Data>DataZ</Data>
</LogReport>

对应的XSLT文档:LogReport.xslt(框架)

这是LogReport.xslt的骨架,中间<body>标签下的注释部分,是我添加后几节中实验代码的部分

<?xml version="1.0" encoding="gb2312"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

  <xsl:output method="html"/>

  <!--计算Pi值-->
  <xsl:template match="/">

    <html>
      <head>
        <meta content="zh-cn" http-equiv="Content-Language"/>
        <meta content="text/html; charset=utf-16" http-equiv="Content-Type"/>
        <title>轴</title>
      </head>
      <body>

      <!--这里输入下面要出现的例子-->

      </body>
    </html>

  </xsl:template>

</xsl:stylesheet>

1-2)子轴:child,属性轴:attribute

子轴child按文档顺序选中上下文节点所有的直接子节点,如果表达式中没有使用轴区分符,那么将被假定使用了子轴

属性轴选择当前节点的所有属性节点,可以用轴名attribute或预定义的缩写词“ @ ”选择属性

示例代码:

<xsl:text>1.child &amp; 2.attribute</xsl:text>
<br/>
<xsl:value-of select="/child::LogReport/attribute::CreateTime"/>
<br/>
<xsl:value-of select="/LogReport/@CreateTime"/>

输出效果:

1.child & 2.attribute
2015/2/7 20:34:17
2015/2/7 20:34:17

3)后代轴:descendant

后代轴选择当前节点的所有后代(子节点、子节点的子节点等),还允许选择属性节点或名称空间节点

示例代码:

<xsl:text>3.descendant</xsl:text>
<br/>
<xsl:for-each select="/LogReport/LogList/Log">
  *<xsl:value-of select="descendant::LogMessage/@Message"/>
  <br/>
</xsl:for-each>

输出效果:

3.descendant
*abcdefg
*hijklmn
*opqrst
*uvwxyz

4)父轴parent

父轴只选择当前节点的直接父节点

示例代码:

<xsl:text>4.parent</xsl:text>
<br/>
<xsl:value-of select="/LogReport/LogList/Log/parent::node()/@ListName"/>
<br/>
<xsl:value-of select="/LogReport/LogList/Log/parent::node()/parent::node()/@CreateTime"/>

输出效果:

4.parent
XXX
2015/2/7 20:34:17

5)祖先轴ancestor

祖先轴按文档顺序的相反方向选择当前节点的所有祖先节点

示例代码:

<xsl:text>5.ancestor</xsl:text>
<br/>
<xsl:value-of select="/LogReport/LogList/Log/ancestor::LogReport/@CreateTime"/>
<br/>
<xsl:value-of select="/LogReport/LogList/Log/ancestor::LogList/@ListName"/>

输出效果:

5.ancestor
2015/2/7 20:34:17
XXX

6)后继-兄弟轴following-sibling

后继-兄弟轴按照文档顺序选择文档中伺候出现的当前节点的所有兄弟节点

示例代码:

<xsl:text>6.following-sibling</xsl:text>
<br/>
<xsl:for-each select="/LogReport/LogList/Log[2]/following-sibling::node()">
  *<xsl:value-of select="@LogItem"/>
  <br/>
</xsl:for-each>

输出效果:

6.following-sibling
*Lee
*Zhao

7)前驱-兄弟轴:preceding-sibling

前驱-兄弟轴按照与文档顺序相反的方向选择文档中此前出现的当前节点的所有兄弟节点

示例代码:

<xsl:text>7.preceding-sibling</xsl:text>
<br/>
<xsl:for-each select="/LogReport/LogList/Log[3]/preceding-sibling::node()">
  *<xsl:value-of select="@LogItem"/>
  <br/>
</xsl:for-each>

输出效果:

7.preceding-sibling
*Zhang
*Wang

8)后继轴:following

除当前节点的所有后代节点外,后继轴按文档顺序选择文档中当前节点之后出现的所有节点

示例代码:

<xsl:text>8.following</xsl:text>
<br/>
<xsl:for-each select="/LogReport/LogList/following::node()">
  *<xsl:value-of select="name()"/>_<xsl:value-of select="."/>
  <br/>
</xsl:for-each>

输出效果:

8.following
*Data_DataX
*_DataX
*Data_DataY
*_DataY
*Data_DataZ
*_DataZ

9)前驱轴:preceding

前驱轴按照与文档顺序相反的方向选择文档中在当前节点之前出现的所有节点

示例代码:

<xsl:text>9.preceding</xsl:text>
<br/>
<xsl:for-each select="/LogReport/LogList/preceding::node()">
  *<xsl:value-of select="name()"/>_<xsl:value-of select="."/>
  <br/>
</xsl:for-each>

输出效果:

9.preceding
*xml-stylesheet_type='text/xsl' href='LogReport.xslt'
*Data_DataA
*_DataA
*Data_DataB
*_DataB
*Data_DataC
*_DataC

10)名称空间轴:namespace

名称空间轴选择当前节点的所有名称空间节点。如果当前节点没有名称空间

示例代码:

<xsl:text>10.namespace</xsl:text>
<br/>
<xsl:value-of select="LogReport/namespace::node()"/>

输出效果:

10.namespace
http://www.w3.org/XML/1998/namespace

11)自身轴:self

自身轴选择当前节点

示例代码:

<xsl:text>11.self</xsl:text>
<br/>
<xsl:value-of select="LogReport/self::node()/@CreateTime"/>

输出效果:

11.self
2015/2/7 20:34:17

12)后代或自身轴:descendant-or-self

后代或自身轴按文档顺序选择当前节点及其所有后代节点,该轴不包括属性节点或名称空间节点

示例代码:

<xsl:text>12.descendant-or-self</xsl:text>
<br/>
<xsl:for-each select="/LogReport/LogList/descendant-or-self::node()">
  *<xsl:value-of select="name()"/>
  <br/>
</xsl:for-each>

输出效果:

12.descendant-or-self
*LogList
*Log
*LogMessage
*Log
*LogMessage
*Log
*LogMessage
*Log
*LogMessage

13)祖先或自身轴:ancestor-or-self

祖先或自身轴按文档顺序选择当前节点及其所有祖先节点

示例代码:

<xsl:text>13.ancestor-or-self</xsl:text>
<br/>
<xsl:for-each select="/LogReport/LogList/Log/ancestor-or-self::node()">
  *<xsl:value-of select="name()"/>:<xsl:value-of select="node()"/>
  <br/>
</xsl:for-each>

输出效果:

13.ancestor-or-self
*:type='text/xsl' href='LogReport.xslt'
*LogReport:DataA
*LogList:
*Log:
*Log:
*Log:
*Log:

最终的XSLT文档:LogReport.xslt(全文)

<?xml version="1.0" encoding="gb2312"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

  <xsl:output method="html"/>

  <!--计算Pi值-->
  <xsl:template match="/">

    <html>
      <head>
        <meta content="zh-cn" http-equiv="Content-Language"/>
        <meta content="text/html; charset=utf-16" http-equiv="Content-Type"/>
        <title>轴</title>
      </head>
      <body>

        <xsl:text>1.child &amp; 2.attribute</xsl:text>
        <br/>
        <xsl:value-of select="/child::LogReport/attribute::CreateTime"/>
        <br/>
        <xsl:value-of select="/LogReport/@CreateTime"/>
        
        <hr/>

        <xsl:text>3.descendant</xsl:text>
        <br/>
        <xsl:for-each select="/LogReport/LogList/Log">
          *<xsl:value-of select="descendant::LogMessage/@Message"/>
          <br/>
        </xsl:for-each>
       
        <hr/>

        <xsl:text>4.parent</xsl:text>
        <br/>
        <xsl:value-of select="/LogReport/LogList/Log/parent::node()/@ListName"/>
        <br/>
        <xsl:value-of select="/LogReport/LogList/Log/parent::node()/parent::node()/@CreateTime"/>

        <hr/>
        
        <xsl:text>5.ancestor</xsl:text>
        <br/>
        <xsl:value-of select="/LogReport/LogList/Log/ancestor::LogReport/@CreateTime"/>
        <br/>
        <xsl:value-of select="/LogReport/LogList/Log/ancestor::LogList/@ListName"/>
      
        <hr/>
        
        <xsl:text>6.following-sibling</xsl:text>
        <br/>
        <xsl:for-each select="/LogReport/LogList/Log[2]/following-sibling::node()">
          *<xsl:value-of select="@LogItem"/>
          <br/>
        </xsl:for-each>
      
        <hr/>
        
        <xsl:text>7.preceding-sibling</xsl:text>
        <br/>
        <xsl:for-each select="/LogReport/LogList/Log[3]/preceding-sibling::node()">
          *<xsl:value-of select="@LogItem"/>
          <br/>
        </xsl:for-each>
      
        <hr/>
        
        <xsl:text>8.following</xsl:text>
        <br/>
        <xsl:for-each select="/LogReport/LogList/following::node()">
          *<xsl:value-of select="name()"/>_<xsl:value-of select="."/>
          <br/>
        </xsl:for-each>
    
        <hr/>
        
        <xsl:text>9.preceding</xsl:text>
        <br/>
        <xsl:for-each select="/LogReport/LogList/preceding::node()">
          *<xsl:value-of select="name()"/>_<xsl:value-of select="."/>
          <br/>
        </xsl:for-each>
    
        <hr/>
        
        <xsl:text>10.namespace</xsl:text>
        <br/>
        <xsl:value-of select="LogReport/namespace::node()"/>
        
        <hr/>
        
        <xsl:text>11.self</xsl:text>
        <br/>
        <xsl:value-of select="LogReport/self::node()/@CreateTime"/>
        
        <hr/>
        
        <xsl:text>12.descendant-or-self</xsl:text>
        <br/>
        <xsl:for-each select="/LogReport/LogList/descendant-or-self::node()">
          *<xsl:value-of select="name()"/>
          <br/>
        </xsl:for-each>
      
        <hr/>
        
        <xsl:text>13.ancestor-or-self</xsl:text>
        <br/>
        <xsl:for-each select="/LogReport/LogList/Log/ancestor-or-self::node()">
          *<xsl:value-of select="name()"/>:<xsl:value-of select="node()"/>
          <br/>
        </xsl:for-each>
    
      </body>
    </html>

  </xsl:template>

</xsl:stylesheet>

END

© 著作权归作者所有

共有 人打赏支持
北风其凉

北风其凉

粉丝 114
博文 497
码字总数 462457
作品 4
朝阳
程序员
使用 xpath 解析 html 的解析器 - Jsoupxpath

JsoupXpath 是一款纯Java开发的使用xpath解析html的解析器,xpath语法分析与执行完全独立,html的DOM树生成借助Jsoup,故命名为JsoupXpath.为了在java里也享受xpath的强大与方便但又苦于找不...

无极小子
2015/10/22
0
0
基于Jsoup的xpath实现--SipSoup

sipsoup是一个基于Jsoup的xpath实现,他将Jsoup的cssQuery变成了xpath语法的一部分,可以实现在xpath内部执行cssQuery和xpath混合模式的链式文档查询 是一款纯Java开发的使用xpath解析html的...

virjar
2017/06/16
173
0
XPath详解,总结

经常在工作中会使用到XPath的相关知识,但每次总会在一些关键的地方不记得或不太清楚,所以免不了每次总要查一些零碎的知识,感觉即很烦又浪费时间,所以对XPath归纳及总结一下。 在这篇文章...

比特流
2009/04/16
0
0
转载:XPath基本语法

出处:http://www.cnblogs.com/Miko2012/archive/2012/10/26/2740840.html XPath的语法最基本的节点之间用/,属性用@,还有几个函数记住了基本问题就可以解决了。可以随时查手册 示例Xml: ...

桃子红了呐
2017/11/09
0
0
Python爬虫:Xpath语法笔记

一、选取节点 常用的路劲表达式: 表达式 描述 实例 nodename 选取nodename节点的所有子节点 xpath('//div') 选取了div节点的所有子节点 / 从根节点选取 xpath('/div') 从根节点上选取div节点...

j_hao104
2016/03/17
4.5K
0
SipSoup 1.3 发布,基于 JSoup 的 Xpath 抽取器

SipSoup是一个基于JSoup的Xpath抽取器,他将JSoup的css Query语法和Xpath语法糅合在一起,支持在xpath内部实现他们之间的混合链式调用。同时SipSoup支持方便的自定义扩展,允许重写函数,轴,...

virjar
2017/06/26
378
0
Selenium 自动化测试从零实战

[运营专题]零预算引爆个人和企业品牌【原文链接】 原来这样做,才能向架构师靠近【原文链接】 Cordova App 打包全揭秘【原文链接】 TensorFlow on Android:物体识别【原文链接】 TensorFlow...

gitchat
2017/11/20
0
0
如果通过当前元素知道父元素、同级元素

基本的思路是知道了当前元素,可以通过xpath的方法找到父元素,知道了父元素之后,就可以通过父元素找子元素的方法找到同级元素。 以百度搜索输入框为例子,找到输入框的父元素,一种是通过....

小新爱测试
2017/06/08
0
0
Python爬虫:细说列表识别提取

天冷要保暖   上次文章后不少小伙伴私信我,对此感兴趣,希望我讲讲列表识别的细节问题。于是有了今天这篇文章。还是先再提一下本算法的核心思想。 排列规则的链接为可以列表块。 列表块范...

Tony带不带水
2017/12/20
0
0
xpath入门笔记(转)

XPath即为XML路径语言(XML Path Language),它是一种用来确定XML文档中某部分位置的语言。 XPath基于XML的树状结构,提供在数据结构树中找寻节点的能力。 起初XPath的提出的初衷是将其作为...

好铁
2016/04/23
69
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

win10 上安装解压版mysql

1.效果 2. 下载MySQL 压缩版 下载地址: https://downloads.mysql.com/archives/community/ 3. 配置 3.1 将下载的文件解压到合适的位置 我最终将myql文件 放在:D:\develop\mysql 最终放的位...

Lucky_Me
14分钟前
1
0
linux服务器修改mtu值优化cpu

一、jumbo frames 相关 1、什么是jumbo frames Jumbo frames 是指比标准Ethernet Frames长的frame,即比1518/1522 bit大的frames,Jumbo frame的大小是每个设备厂商规定的,不属于IEEE标准;...

问题终结者
28分钟前
1
0
expect脚本同步文件expect脚本指定host和要同步的文件 构建文件分发系统批量远程执行命令

expect脚本同步文件 在一台机器上把文件同步到多台机器上 自动同步文件 #!/usr/bin/expectset passwd "123456"spawn rsync -av root@192.168.133.132:/tmp/12.txt /tmp/expect {"yes...

lyy549745
29分钟前
0
0
36.rsync下 日志 screen

10.32/10.33 rsync通过服务同步 10.34 linux系统日志 10.35 screen工具 10.32/10.33 rsync通过服务同步: rsync还可以通过服务的方式同步。那需要开启一个服务,他的架构是cs架构,客户端服务...

王鑫linux
37分钟前
0
0
matplotlib 保存图片时的参数

简单绘图 import matplotlib.pyplot as pltplt.plot(range(10)) 保存为csv格式,放大后依然很清晰 plt.savefig('t1.svg') 普通保存放大后会有点模糊文件大小20多k plt.savefig('t5.p...

阿豪boy
41分钟前
1
0
java 8 复合Lambda 表达式

comparator 比较器复合 //排序Comparator.comparing(Apple::getWeight);List<Apple> list = Stream.of(new Apple(1, "a"), new Apple(2, "b"), new Apple(3, "c")) .collect(......

Canaan_
昨天
0
0
nginx负载均衡

一、nginx 负载均衡 拓扑图: 主机信息: 1、负载均衡器1(lb1):192.168.10.205 RHEL7.5 2、负载均衡器2(lb2):192.168.10.206 RHEL7.5 3、web服务器1(web01):192.168.10.207 Centos...

人在艹木中
昨天
0
0
做了一个小网站

做了一个小网站 www.kanxs123.com

叶落花开
昨天
1
0
继社会佩奇之后,又尝试了可爱的蓝胖子,有趣 Python

#哆啦A梦# !/usr/bin/env python3# -*- coding: utf-8 -*-# @Author: dong dong# @Env: python 3.6from turtle import *# 无轨迹跳跃def my_goto(x, y): penup(...

Py爱好
昨天
0
0
shell及python脚本方式登录服务器

一、问题 在工作过程中,经常会遇见需要登录服务器,并且因为安全的原因,需要使用交互的方式登录,而且shell、python在工作中也经常用到,并且可以提供交互的功能。都是利用了expect、spawn...

yangjianzhou
昨天
1
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部