實驗:關於XPath中的13個軸

XSLT使用XPath來找尋XML文檔中的信息,這幾天在學習XSLT的找尋路徑過程當中,我寫了下面這個例子,來加深我對XPath中各個軸的概念的理解html

測試用的XML文檔和XSLT文檔node

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,屬性軸:attributeui

子軸child按文檔順序選中上下文節點全部的直接子節點,若是表達式中沒有使用軸區分符,那麼將被假定使用了子軸
spa

屬性軸選擇當前節點的全部屬性節點,能夠用軸名attribute或預約義的縮寫詞「 @ 」選擇屬性
code

示例代碼:orm

<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"/>

輸出效果:xml

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

相關文章
相關標籤/搜索