2014-11-25 27 views
3

當我們設置路徑時,// .//有什麼區別? 第二個問題,如果我想獲得一些信息的父節點在for-each塊我怎麼能得到它?XSLT select //和.//

回答

3

//是後代軸的縮寫。 如果您說//para,它會選擇整個文檔中的所有para元素。

當你說.//para,所有para元素是上下文節點的後代被選中。

對於演示,考慮這個XML:

<l1> 
<para>1</para> 
<l2> 
    <para>2</para> 
    <l3> 
     <para>3</para> 
    </l3> 
</l2> 
</l1> 

這XSLT:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output method="xml" indent="yes"/> 
<xsl:template match="/l1"> 
    <output> 
     <xsl:apply-templates select="l2"/> 
    </output> 
</xsl:template> 
<xsl:template match="l2"> 
    <para-all> 
     <xsl:copy-of select="//para"/> 
    </para-all> 
    <para-context> 
     <xsl:copy-of select=".//para"/> 
    </para-context> 
    <parent> 
     <xsl:value-of select="name(parent::*)"/> 
    </parent> 
</xsl:template> 
</xsl:stylesheet> 

和輸出,您將得到的是:

<?xml version="1.0" encoding="utf-8"?> 
<output> 
<para-all> 
    <para>1</para> 
    <para>2</para> 
    <para>3</para> 
</para-all> 
<para-context> 
    <para>2</para> 
    <para>3</para> 
</para-context> 
<parent>l1</parent> 
</output> 

para-all得到所有的para s在文檔中,而para-context只獲得那些01 (上下文節點)

關於如何選擇父代,如代碼中所示(請參閱XSLT中的parent元素)。 在上例中,上下文節點爲l2,並且通過使用父軸,正在寫入父元素的名稱。 您可以使用parent::*../

+0

對不起,挑選挑剔。實際上,// //是'後代或自我::'軸,而不是'後代::'軸。 「descendant ::'軸沒有簡寫。 – 2014-11-25 12:21:31

+1

是的,但我碰到連這個是'// *'是一樣的'/後代或自身::節點()/子:: *',我認爲是一樣的'後裔:: *'。任何幫助,將不勝感激。 – 2014-11-25 12:34:23

+2

如果不包含位置謂詞,'// x'和'/ descendant :: x'的含義相同,'.// x'和'./descendant :: x'的含義相同。但是,當職位發揮作用時,您需要知道'// x [1]'意味着'/ descendant-or-self :: node()/ child :: x [1]'。 – 2014-11-25 15:09:42