xslt用于停止重复代码

时间:2013-02-05 09:56:57

标签: xslt umbraco

您好我是xslt的初学者,刚刚开始使用它,因为我正在使用Umbraco建立一个网站。我想知道是否有任何方法在xslt中创建函数,所以我不必重复相同的事情。我看过几个网站,但不太了解它

我的代码是:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE xsl:stylesheet [ <!ENTITY nbsp "&#x00A0;"> ]>
<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) &gt; 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']) &gt; 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']) &gt; 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节点我正在重复使用相同的代码来列出这些孩子,所以我想知道我是否可以把它拉到一个函数中,所以我不需要为我需要的每个级别的孩子嵌套相同的代码

3 个答案:

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

祝你好运 雅各布