3
當我們設置路徑時,// .//
有什麼區別? 第二個問題,如果我想獲得一些信息的父節點在for-each塊我怎麼能得到它?XSLT select //和.//
當我們設置路徑時,// .//
有什麼區別? 第二個問題,如果我想獲得一些信息的父節點在for-each塊我怎麼能得到它?XSLT select //和.//
//
是後代軸的縮寫。 如果您說//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::*
或../
對不起,挑選挑剔。實際上,// //是'後代或自我::'軸,而不是'後代::'軸。 「descendant ::'軸沒有簡寫。 – 2014-11-25 12:21:31
是的,但我碰到連這個是'// *'是一樣的'/後代或自身::節點()/子:: *',我認爲是一樣的'後裔:: *'。任何幫助,將不勝感激。 – 2014-11-25 12:34:23
如果不包含位置謂詞,'// x'和'/ descendant :: x'的含義相同,'.// x'和'./descendant :: x'的含義相同。但是,當職位發揮作用時,您需要知道'// x [1]'意味着'/ descendant-or-self :: node()/ child :: x [1]'。 – 2014-11-25 15:09:42