xslt - получает тип узла под дочерним - PullRequest
1 голос
/ 31 октября 2011

Я использую Umbraco и у меня возникли проблемы с XSLT.

У меня есть следующая структура:

root
   nodeA
      nodeB
      nodeB
      nodeB
   nodeC
      nodeA
         nodeB
         nodeB
         nodeB

Я хочу иметь возможность получить узел B от узла A под root или от узла A под узел C.

В настоящее время я использую следующее:

 <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 Ответ

1 голос
/ 31 октября 2011
<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:: или псевдооператора // - они приводят к значительной неэффективности (медленное выполнение) и // имеет аномальное и нелогичное поведение при использовании вместе с оператором [].

...