xslt - 获取子节点下的节点类型

时间:2011-10-31 04:32:59

标签: xslt xpath umbraco

我正在使用Umbraco并且在使用XSLT时遇到了一些麻烦。

我有以下结构:

root
   nodeA
      nodeB
      nodeB
      nodeB
   nodeC
      nodeA
         nodeB
         nodeB
         nodeB

我希望能够从nodeA下的nodeA或nodeC下的nodeA获取nodeB。

我目前使用以下内容:

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

1 个答案:

答案 0 :(得分: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::轴或//伪操作符 - 它们会导致效率显着降低(缓慢执行)//[]运算符一起使用时会出现异常且反直觉的行为。