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