实验:关于XPath中的13个轴

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

时间: 2024-07-30 13:48:53

实验:关于XPath中的13个轴的相关文章

Android基础入门教程——8.1.3 Android中的13种Drawable小结 Part 3

Android基础入门教程--8.1.3 Android中的13种Drawable小结 Part 3 标签(空格分隔): Android基础入门教程 本节引言: 本节我们来把剩下的四种Drawable也学完,他们分别是: LayerDrawable,TransitionDrawable,LevelListDrawable和StateListDrawable, 依旧贴下13种Drawable的导图: 1.LayerDrawable 层图形对象,包含一个Drawable数组,然后按照数组对应的顺序来

Android基础入门教程——8.1.2 Android中的13种Drawable小结 Part 2

Android基础入门教程--8.1.2 Android中的13种Drawable小结 Part 2 标签(空格分隔): Android基础入门教程 本节引言: 本节我们继续来学习Android中的Drawable资源,上一节我们学习了: ColorDrawable:NinePatchDrawable: ShapeDrawable:GradientDrawable!这四个Drawable~ 而本节我们继续来学习接下来的五个Drawable,他们分别是: BitmapDrawable:Insert

Android基础入门教程——8.1.1 Android中的13种Drawable小结 Part 1

Android基础入门教程--8.1.1 Android中的13种Drawable小结 Part 1 标签(空格分隔): Android基础入门教程 本节引言: 从本节开始我们来学习Android中绘图与动画中的一些基础知识,为我们进阶部分的自定义 打下基础!而第一节我们来扣下Android中的Drawable!Android中给我们提供了多达13种的 Drawable,本节我们就来一个个撸一遍! Drawable资源使用注意事项 Drawable分为两种: 一种是我们普通的图片资源,在Andr

【转贴】J2EE中的13种技术规范

J2EE平台由一整套服务(Services).应用程序接口(APIs)和协议构成,它对开发基于Web的多层应用提供了功能支持,下面对J2EE中的13种技术规范进行简单的描述(限于篇幅,这里只能进行简单的描述): 1.JDBC(Java Database Connectivity):    JDBC API为访问不同的数据库提供了一种统一的途径,象ODBC一样,JDBC对开发者屏蔽了一些细节问题,另外,JDCB对数据库的访问也具有平台无关性. 2.JNDI(Java Name and Direct

xpath中的ends-with无效解决方案

xpath定位遇到如下问题:br/>//*[ends-with(@id,"多测师")]定位不到以"多测师"结尾的元素原因如下:ends-with是xpath2.0的语法,可能你的浏览器还只支持1.0的语法 解决如下://*[ends-with(@id,"多测师")] 等价于 //input[substring(@id, string-length(@id) - string-length('多测师') +1) = '多测师'] xpath中

第三方工具 - echarts中 设置x||y轴文案、提示文字等为固定字数,超出显示&quot;...&quot;

起初看到这种需求的时候,我是这个状态 对,我是拒绝的,人家echats画出来就是一个canvas,你让我怎么加... 但是,作为一个"有点追求的"前端,我得想招试试总结下来,唯一的突破点就是echarts的配置了. echarts配置项网址:http://echarts.baidu.com/option.html 最后果然被我找到了 一.先说x||y轴的文案处理: 如图,x轴的配置也就都在这里了 而关于x轴文案的设置,就是这个axisLabel属性了 而跟内容有关的也就是这个forma

数据库设计中的13个技巧

1.原始单据与实体之间的关系可以是一对一.一对多.多对多的关系.在一般情况下,它们是一对一的关系:即一张原始单据对应且只对应一个实体.在特殊情况下,它们可能是一对多或多对一的关系,即一张原始单证对应多个实体,或多张原始单证对应一个实体.这里的实体可以理解为基本表.明确这种对应关系后,对我们设计录入界面大有好处. [例1]:一份员工履历资料,在人力资源信息系统中,就对应三个基本表:员工基本情况表.社会关系表.工作简历表.这就是"一张原始单证对应多个实体"的典型例子. 2.主键与外键一般而

xpath中遇到[&lt;Element a at 0x39a9a80&gt;](转)

Element是什么 回归正题,大家晕头转脑的看完繁杂的语法之后,已经迫不及待写点什么东西了,然后部分同学可能遇到了这个 <Element a at 0x39a9a80>或者类似 Element a at 0x???????,这样的一个值,某种意义上来说,当你打印变量的时候得到的这个值,其实它是一个列表,然后列表中的每一个值都是一个字典 from bs4 import BeautifulSoup from lxml import etree import requests gjc='SHKD-

【Python】xpath中为什么粘贴进去代码后老报错?如何在定位元素的时候准确找到定位切入点?

1. xpath后()中双引号("")里面不能套用双引号(""),把里面的双引号改成单引号('')报错就没有了. 2.如何在定位元素的时候准确找到定位切入点? 要巧妙运用F12,确定要定位的页面元素后,看元素相关属性值是否在页面中的代码中是唯一的(如果有id值可以用id值去定位,一般页面中的id值都是唯一性的),否则可以通过Ctrl+F 将准备试用定位元素的属性值搜索看看该页面是否有相同的值,如果有那么就不能用这个属性值定位,如果没有那么就可以用这个属性值定位啦~这