您好我是xslt的初学者,刚刚开始使用它,因为我正在使用Umbraco建立一个网站。我想知道是否有任何方法在xslt中创建函数,所以我不必重复相同的事情。我看过几个网站,但不太了解它
我的代码是:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE xsl:stylesheet [ <!ENTITY nbsp " "> ]>
<xsl:stylesheet
version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:msxml="urn:schemas-microsoft-com:xslt"
xmlns:umbraco.library="urn:umbraco.library"
exclude-result-prefixes="msxml umbraco.library">
<xsl:output method="xml" omit-xml-declaration="yes"/>
<xsl:param name="currentPage"/>
<xsl:template match="/">
<xsl:variable name="items" select="$currentPage/ancestor-or-self::* [@isDoc and @level = 1]/* [@isDoc and string(umbracoNaviHide) != '1']"/>
<!-- The fun starts here -->
<xsl:if test="count($items) > 0">
<ul id="SubNav" class="level{@level}">
<xsl:for-each select="$items">
<li>
<a href="{umbraco.library:NiceUrl(@id)}">
<xsl:value-of select="@nodeName"/>
</a>
<xsl:if test="count(./child::*[@isDoc and string(umbracoNaviHide) != '1']) > 0">
<ul class="level{@level}">
<xsl:for-each select="./child::*[@isDoc and string(umbracoNaviHide) != '1']">
<li>
<a href="{umbraco.library:NiceUrl(@id)}">
<xsl:value-of select="@nodeName"/>
</a>
<xsl:if test="count(./child::*[@isDoc and string(umbracoNaviHide) != '1']) > 0">
<ul class="level{@level}">
<xsl:for-each select="./child::*[@isDoc and string(umbracoNaviHide) != '1']">
<li>
<a href="{umbraco.library:NiceUrl(@id)}">
<xsl:value-of select="@nodeName"/>
</a>
</li>
</xsl:for-each>
</ul>
</xsl:if>
</li>
</xsl:for-each>
</ul>
</xsl:if>
</li>
</xsl:for-each>
</ul>
</xsl:if>
</xsl:template>
</xsl:stylesheet>
正如你所看到的foreach节点我正在重复使用相同的代码来列出这些孩子,所以我想知道我是否可以把它拉到一个函数中,所以我不需要为我需要的每个级别的孩子嵌套相同的代码
答案 0 :(得分:1)
XSLT中的想法是使用与XML结构中某些节点匹配的模板。您甚至可以使用“模式”将相同的模板应用于不同的处理指令。
我不知道您的XML结构,但我认为这是可行的方法。在stackoverflow中搜索也提供了信息:https://stackoverflow.com/questions/tagged/templates+xslt
祝你好运, 彼得
答案 1 :(得分:0)
XSLT 2.0允许您编写可以从代码中的XPath表达式调用的函数。例如,您可以定义
<xsl:function name="f:isRelevant" as="xs:boolean">
<xsl:param name="node" as="element()"/>
<xsl:sequence
select="count($node/child::*[@isDoc and string(umbracoNaviHide) != '1'])"/>
</xsl:function>
然后你可以写,例如
<xsl:if test="f:isRelevant(.)">...</xsl:if>
如果你的平台限制你使用XSLT 1.0,那么你将不得不忍受你的代码更加冗长。你可以使用命名模板和xsl:call-template指令来处理常见的XSLT代码块,但它们并不像函数那样方便,例如你不能在xsl的测试表达式中调用它们:if as this in this示例
答案 2 :(得分:0)
试试看这个解决方案,它是一个用于在umbraco中创建导航的免费模板:
http://our.umbraco.org/projects/website-utilities/cogworks-flexible-navigation
它是一个具有必要设置的宏: http://our.umbraco.org/media/wiki/5435/633880549558700000_Screen-shot-2009-09-09-at-000101.jpg
祝你好运 雅各布