0

こんにちは、私は xslt の完全な初心者で、Umbraco でサイトを構築しているため、xslt を使い始めたばかりです。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 ノードで同じコードを再利用して子を一覧表示しているので、必要な子のレベルごとに同じコードをネストする必要がないように、これを関数に引き出すことができるかどうか疑問に思っていました。

4

2 に答える 2

1

XSLTの考え方は、XML構造内の特定のノードに一致するテンプレートを操作することです。「モード」を使用して、異なる処理命令でまったく同じテンプレートを適用することもできます。

私はあなたのXML構造を知りませんが、それが進むべき道だと思います。stackoverflowで検索すると、情報も提供されます:https ://stackoverflow.com/questions/tagged/templates+xslt

于 2013-02-05T10:25:20.780 に答える
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 のテスト式内でそれらを呼び出すことはできません。例。

于 2013-02-05T11:27:00.440 に答える