2011-10-31 91 views
1

我正在使用Umbraco並在XSLT中遇到了一些問題。xslt - 獲取子節點下的節點類型

我有以下結構:

root 
    nodeA 
     nodeB 
     nodeB 
     nodeB 
    nodeC 
     nodeA 
     nodeB 
     nodeB 
     nodeB 

我希望能夠在根或nodeA上nodeC上從下得到了nodeA節點B。

我目前使用以下方法:

<xsl:param name="currentPage"/> 
    <xsl:variable name="siteRoot" select="$currentPage/ancestor-or-self::*/nodeC" /> 
<xsl:template match="/"> 

<!-- start writing XSLT --> 
    <xsl:for-each select="$siteRoot/ancestor-or-self::*/nodeA/nodeB"> 
    <xsl:if test="string(umbracoNaviHide) != '1'"> 
    <li style="background-image: none;"> 
     <xsl:if test="position() = last()"> 
     <xsl:attribute name="class">no-border</xsl:attribute> 
     </xsl:if> 
      <a> 
       <xsl:attribute name="href"> 
       <xsl:value-of select="umbraco.library:NiceUrl(current()/@id)"/> 
       </xsl:attribute> 
       <xsl:attribute name="style"> 
       text-decoration: none; 
       </xsl:attribute> 
       <xsl:value-of select="./Name" /></a></li> 
    </xsl:if> 
    </xsl:for-each> 
</xsl:template> 
+0

@Dimire - 有關XPath的書在閱讀列表中。在MVC3之後,實體框架和Objective-C :) –

回答

1
<xsl:param name="currentPage"/> 
    <xsl:variable name="siteRoot" select="$currentPage/ancestor-or-self::*/nodeC" /> 
. . . 
    <xsl:for-each select="$siteRoot/ancestor-or-self::*/nodeA/nodeB"> 

你必須閱讀XPath的東西,學習不同軸的意義。

你真正想要這個代碼的完全相反:

<xsl:param name="currentPage"/> 
     <xsl:variable name="siteRoot" select="$currentPage/descendant-or-self::nodeC[1]" /> 
    . . . 
    <xsl:for-each select="$siteRoot/nodeA/nodeB"> 

或者,作爲一個單一的XPath表達式更好:

$currentPage/*/nodeC[1]/nodeA/nodeB 

注意:只要有可能,應避免使用XPath descendant::descendant-or-self::軸或僞操作符//嘿,導致效率顯着下降(執行速度緩慢),並且與[]運營商一起使用時會產生異常和反直覺行爲。