最近、どのエンジンで自分のxmlを解析してXSLに固執するのかという質問がありましたが、半分しか完了できません。 (ref:Which language to use to parse xml for navigation)XSLで変数に基づいて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";
これは非常に不明です。完全な(しかし、最小限の)例を提供してください:ソースXML文書、完全な結果、および変換が実装しなければならないすべての規則。 –
@Dimitre Novatchev、Hi Dimitre、私の質問を見る時間をとってくれてありがとう、私はより多くの例でそれを更新しました、うまくいけば、これは物事をより明確にします。 TIA。 – Jared
あなたが求めていることは私にはあまり明確ではありません。特定したノードのブランチを拡張しますか? –