2011-02-16 6 views
1

最近、どのエンジンで自分のxmlを解析してXSLに固執するのかという質問がありましたが、半分しか完了できません。 (ref:Which language to use to parse xml for navigationXSLで変数に基づいてxmlファイルをトラバースする方法

私は、<root> --> <menu> --> <nav>をトラバースすることに成功しましたが、navの下にいる子どもたちと私のロジックは完全に台無しになりました。

質問@pathが次の子ノード層である場合、XML子ノードでより深く進むためにxslで自分のロジックを繰り返すにはどうすればよいですか?

私はこの権利をしていますか?私はここで何かが欠けているように感じ、テンプレートを何とか使っているはずですか?

たとえば、ここに私のxslスタイルシートがあります。

<root name="menutest"> 
    <menu> 
     <nav name="home" path="index.php" /> 

     <nav name="menulink1" path="link1.php"> 
      <nav name="menulink1child1" path="menulink1childlink1.php"> 
      <nav name="menulink1child1child1" 
        path="menulink1childlink1childlink1.php" /> 
      </nav> 
     </nav> 

     <nav name="menulink2" path="link2.php"> 
     <nav name="menulink1child2" path="menulink2childlink2.php"> 
      <nav name="menulink2child2child2" 
       path="menulink2childlink2childlink2.php" /> 
     </nav> 
     </nav> 

     <nav name="menulink3" path="link3.php"> 
     <nav name="menulink3child3" path="menulink3childlink3.php"> 
      <nav name="menulink3child3child3" 
        path="menulink3childlink3childlink3.php" /> 
     </nav> 
     </nav> 

     <nav name="menulink4" path="link4.php"> 
     <nav name="menulink4child4" 
       path="menulink4childlink4.php"> 
      <nav name="menulink4child4child4" 
       path="menulink4childlink4childlink4.php" /> 
     </nav> 
     </nav> 
    </menu> 
</root> 

これは、基本的には唯一の最初の層のparam "$ページ" に基づいて<nav>子供を示しています

<?xml version="1.0" encoding="UTF-8"?> 
<!-- 
    Document : sitemap.xsl 
    Created on : 2 February 2011, 14:53 
    Author  : Jared 
    Description: 
     Purpose of transformation follows. 
--> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output method="html" /> 
    <xsl:param name="page" select="default"/> 

    <xsl:template match="root"> 
     <ul class="level-0 top-level"> 
      <xsl:for-each select="*/nav"> 
       <xsl:choose> 
        <xsl:when test="$page = '/index.aspx'"> 
         <!-- level 0 --> 
         <li> 
          <a><xsl:attribute name="href"><xsl:value-of select="@path" /></xsl:attribute><xsl:value-of select="@name" /></a> 
         </li> 
        </xsl:when> 

        <xsl:when test="@path=$page and $page != '/index.aspx'"> 
         <!-- level 2 --> 
         <li class="children-open current-menu-page"> 
          <a><xsl:attribute name="href"><xsl:value-of select="@path" /></xsl:attribute><xsl:value-of select="@name" /></a> 
          <ul class="level-2 current-menu"> 
           <xsl:for-each select="/root/menu/nav[@path=$page]/child::*"> 
            <li> 
             <a><xsl:attribute name="href"><xsl:value-of select="@path" /></xsl:attribute><xsl:value-of select="@name" /><br /></a> 
            </li> 
           </xsl:for-each> 
          </ul> 
         </li> 
        </xsl:when> 


        <xsl:otherwise> 
         <li> 
          <a><xsl:attribute name="href"><xsl:value-of select="@path" /></xsl:attribute><xsl:value-of select="@name" /></a> 
         </li> 
        </xsl:otherwise> 


       </xsl:choose> 

      </xsl:for-each> 

     </ul> 
    </xsl:template> 

</xsl:stylesheet> 

XMLファイルには、次のようになります。 どのようにメニューの動作の例(S)とどのは基本的に<nav>ノードが子で揃え、選択されたノード、インデントされたノードは親の子であり、その上などなどxml example http://fraudo.orconhosting.net.nz/xml.png

TIA ジャレッド

更新されたコードスニペット

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output method="html" /> 
    <xsl:param name="page" select="'index.aspx'"/> 

    <xsl:template name="makeUL"> 
     <ul class="level-2 current-menu"> 
      <xsl:apply-templates/> 
     </ul> 
    </xsl:template> 
    <xsl:template match="nav"> 

      <li> 
      <xsl:if test=".//@path = $page and $page != '/index.aspx'"> 
       <xsl:attribute name="class"><xsl:text>children-open current-menu-page</xsl:text></xsl:attribute> 
      </xsl:if> 
      <a href="{@path}"> 
       <xsl:value-of select="@name" /> 
      </a> 
      <xsl:if test=".//@path = $page and $page != '/index.aspx'"> 
       <xsl:call-template name="makeUL"/> 
      </xsl:if> 
     </li> 

    </xsl:template> 
</xsl:stylesheet> 

xml解析前に "ul"をエコーアウトしていますが、間違っている可能性があります:)。以下のために、それぞれのxsl:選択し、代わりにそれを書くの「XSLTの道」テンプレートルールを使用して、XSLのような伝統的な構造 -

echo '<ul class="level-0 top-level">'."\n\r"; 
    echo $xsl->transformToXML($dom); 
echo '</ul>'."\n\r"; 
+0

これは非常に不明です。完全な(しかし、最小限の)例を提供してください:ソースXML文書、完全な結果、および変換が実装しなければならないすべての規則。 –

+0

@Dimitre Novatchev、Hi Dimitre、私の質問を見る時間をとってくれてありがとう、私はより多くの例でそれを更新しました、うまくいけば、これは物事をより明確にします。 TIA。 – Jared

+0

あなたが求めていることは私にはあまり明確ではありません。特定したノードのブランチを拡張しますか? –

答えて

2

あなたは、このスタイルシートを特定したノードを含むツリーの分岐を展開する場合:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output method="html" /> 
    <xsl:param name="page" select="'menulink1childlink1.php'"/> 
    <xsl:template match="menu" name="makeUL"> 
     <ul> 
      <xsl:apply-templates/> 
     </ul> 
    </xsl:template> 
    <xsl:template match="nav"> 
     <li> 
      <a href="{@path}"> 
       <xsl:value-of select="@name" /> 
      </a> 
      <xsl:if test=".//@path = $page"> 
       <xsl:call-template name="makeUL"/> 
      </xsl:if> 
     </li> 
    </xsl:template> 
</xsl:stylesheet> 

出力:

<ul> 
    <li><a href="index.php">home</a></li> 
    <li><a href="link1.php">menulink1</a> 
     <ul> 
      <li><a href="menulink1childlink1.php">menulink1child1</a> 
       <ul> 
        <li><a href="menulink1childlink1childlink1.php" 
          >menulink1child1child1</a></li> 
       </ul> 
      </li> 
     </ul> 
    </li> 
    <li><a href="link2.php">menulink2</a></li> 
    <li><a href="link3.php">menulink3</a></li> 
    <li><a href="link4.php">menulink4</a></li> 
</ul> 

レンダリング:

  • ホーム
  • menulink1
    • menulink1child1
      • menulink1child1child1
  • menulink2
  • menulink3
  • menulink4

注:これは、.//の略語が便利な唯一のケースです。

+0

@Alejandroありがとう、それをやっている、私はそのコードスニペットの更新を含めるので、私は何をしようとしているかを見ることができます。あなたは今私を正しい方向に置いてきましたので、私は今これを終えることができると感じています、tyvm。 – Jared

+0

@ Jared:「@ class」を追加しなかったのは、明確ではなかったからです。最初の 'ul' * level-0 top-level *、それ以外のすべて* level-2 current-menu *; (祖先を含む)オープンブランチの 'li' *子供たちは現在のメニュー - ページ*を開いていますか? –

+0

@Alejandro yup first ulはレベル0です、私は明らかにそれが適切に説明するにはあまりにもよく分かっています:申し訳ありませんが、第二層の児童ulはレベル2などでなければなりません。しかし、あなたの答えは本当に役に立ちました。あなたがオリジナルの答えtyvmに何かを追加しない限り、私は残りの部分を処理できると思います。 – Jared

2

あなたのトラブルの根本的な原因は、使用する処理「プル」しようとしているということですおよびxsl:apply-templatesを使用します。通常、コードを「プル」スタイルで記述することは可能ですが、専門家はこれを避けるため、この種の問題につながる可能性があります。

私は「普通」と言いますが、入力データが再帰的である(ナビゲーション要素内の要素を無期限にネストしている)場合は不可能です。再帰的なコードを使用して再帰的なデータのみを処理することができます。この状況では、適用テンプレートのスタイルが重要になります。チュートリアルに座り、概念を理解してコーディングで使用するまで、いくつかの例を読んでください。

+0

+1は間違っていたと指摘しています。 – Jared

関連する問題