Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xslt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Xml XSLT导航菜单_Xml_Xslt_Xhtml_Tree_Navigation - Fatal编程技术网

Xml XSLT导航菜单

Xml XSLT导航菜单,xml,xslt,xhtml,tree,navigation,Xml,Xslt,Xhtml,Tree,Navigation,我对XSL转换(XSLT-1)有一个问题。几天以来我一直在尝试,但我没有让它发挥作用 我想用XML和XSLT-1构建一个标准的网站树导航。它应该只显示当前项目路径上的项目。如果当前项具有子项,则应打开下一个节点 我的XML源代码如下所示: <cat> <item id="0" name="1"> <item id="1" name="1.1"></item> <item id="2" name="1.2

我对XSL转换(XSLT-1)有一个问题。几天以来我一直在尝试,但我没有让它发挥作用

我想用XML和XSLT-1构建一个标准的网站树导航。它应该只显示当前项目路径上的项目。如果当前项具有子项,则应打开下一个节点

我的XML源代码如下所示:

<cat>
    <item id="0" name="1">
        <item id="1" name="1.1"></item>
        <item id="2" name="1.2"></item>
        <item id="3" name="1.3"></item>
        <item id="4" name="1.4">
            <item id="5" name="1.4.1">
                <item id="6" name="1.4.1.1"></item>
                <item id="7" name="1.4.1.2"></item>
                <item id="8" name="1.4.1.3"></item>
            </item>
            <item id="9" name="1.4.2"></item>
            <item id="10" name="1.4.3"></item>
        </item>
        <item id="11" name="1.5"></item>
        <item id="12" name="1.6"></item>
    </item>
    <item id="13" name="2">
        <item id="14" name="2.1"></item>
        <item id="15" name="2.2"></item>
    </item>
    <item id="16" name="3"></item>
</cat>
<ul>
    <li>1
        <ul>
            <li>1.1</li>
            <li>1.2</li>
            <li>1.3</li>
            <li>1.4
                <ul>
                    <li>1.4.1
                        <ul>
                            <li>1.4.1.1</li>
                            <li class="activeitem">1.4.1.2</li>
                            <li>1.4.1.3</li>
                        </ul>
                    </li>
                    <li>1.4.2</li>
                    <li>1.4.3</li>
                </ul>
            </li>
            <li>1.5</li>
            <li>1.6</li>
        </ul>
    </li>
    <li>2</li>
    <li>3</li>
</ul>
<ul>
    <li>1
        <ul>
            <li>1.1</li>
            <li>1.2</li>
            <li>1.3</li>
            <li class="activeitem">1.4
                <ul>
                    <li>1.4.1</li>
                    <li>1.4.2</li>
                    <li>1.4.3</li>
                </ul>
            </li>
            <li>1.5</li>
            <li>1.6</li>
        </ul>
    </li>
    <li>2</li>
    <li>3</li>
</ul>

现在我想调用一个$pageid=7的页面,通过URL发送,它应该显示如下输出:

<cat>
    <item id="0" name="1">
        <item id="1" name="1.1"></item>
        <item id="2" name="1.2"></item>
        <item id="3" name="1.3"></item>
        <item id="4" name="1.4">
            <item id="5" name="1.4.1">
                <item id="6" name="1.4.1.1"></item>
                <item id="7" name="1.4.1.2"></item>
                <item id="8" name="1.4.1.3"></item>
            </item>
            <item id="9" name="1.4.2"></item>
            <item id="10" name="1.4.3"></item>
        </item>
        <item id="11" name="1.5"></item>
        <item id="12" name="1.6"></item>
    </item>
    <item id="13" name="2">
        <item id="14" name="2.1"></item>
        <item id="15" name="2.2"></item>
    </item>
    <item id="16" name="3"></item>
</cat>
<ul>
    <li>1
        <ul>
            <li>1.1</li>
            <li>1.2</li>
            <li>1.3</li>
            <li>1.4
                <ul>
                    <li>1.4.1
                        <ul>
                            <li>1.4.1.1</li>
                            <li class="activeitem">1.4.1.2</li>
                            <li>1.4.1.3</li>
                        </ul>
                    </li>
                    <li>1.4.2</li>
                    <li>1.4.3</li>
                </ul>
            </li>
            <li>1.5</li>
            <li>1.6</li>
        </ul>
    </li>
    <li>2</li>
    <li>3</li>
</ul>
<ul>
    <li>1
        <ul>
            <li>1.1</li>
            <li>1.2</li>
            <li>1.3</li>
            <li class="activeitem">1.4
                <ul>
                    <li>1.4.1</li>
                    <li>1.4.2</li>
                    <li>1.4.3</li>
                </ul>
            </li>
            <li>1.5</li>
            <li>1.6</li>
        </ul>
    </li>
    <li>2</li>
    <li>3</li>
</ul>
  • 一,
    • 1.1
    • 1.2
    • 1.3
    • 1.4
      • 1.4.1
        • 1.4.1.1
        • 1.4.1.2
        • 1.4.1.3
      • 1.4.2
      • 1.4.3
    • 1.5
    • 1.6
  • 二,
  • 三,
如果我调用一个$pageid=4的页面,并通过URL发送,它应该显示如下输出:

<cat>
    <item id="0" name="1">
        <item id="1" name="1.1"></item>
        <item id="2" name="1.2"></item>
        <item id="3" name="1.3"></item>
        <item id="4" name="1.4">
            <item id="5" name="1.4.1">
                <item id="6" name="1.4.1.1"></item>
                <item id="7" name="1.4.1.2"></item>
                <item id="8" name="1.4.1.3"></item>
            </item>
            <item id="9" name="1.4.2"></item>
            <item id="10" name="1.4.3"></item>
        </item>
        <item id="11" name="1.5"></item>
        <item id="12" name="1.6"></item>
    </item>
    <item id="13" name="2">
        <item id="14" name="2.1"></item>
        <item id="15" name="2.2"></item>
    </item>
    <item id="16" name="3"></item>
</cat>
<ul>
    <li>1
        <ul>
            <li>1.1</li>
            <li>1.2</li>
            <li>1.3</li>
            <li>1.4
                <ul>
                    <li>1.4.1
                        <ul>
                            <li>1.4.1.1</li>
                            <li class="activeitem">1.4.1.2</li>
                            <li>1.4.1.3</li>
                        </ul>
                    </li>
                    <li>1.4.2</li>
                    <li>1.4.3</li>
                </ul>
            </li>
            <li>1.5</li>
            <li>1.6</li>
        </ul>
    </li>
    <li>2</li>
    <li>3</li>
</ul>
<ul>
    <li>1
        <ul>
            <li>1.1</li>
            <li>1.2</li>
            <li>1.3</li>
            <li class="activeitem">1.4
                <ul>
                    <li>1.4.1</li>
                    <li>1.4.2</li>
                    <li>1.4.3</li>
                </ul>
            </li>
            <li>1.5</li>
            <li>1.6</li>
        </ul>
    </li>
    <li>2</li>
    <li>3</li>
</ul>
  • 一,
    • 1.1
    • 1.2
    • 1.3
    • 1.4
      • 1.4.1
      • 1.4.2
      • 1.4.3
    • 1.5
    • 1.6
  • 二,
  • 三,
希望我的例子大家都能理解

我已经有了一个网站地图和一个面包屑导航,但这一个似乎是非常棘手和经验丰富

我试图修改来自的示例,但效果不好。它只显示项目的路径,而不显示其余的路径

有XSLT-1经验的人能帮我吗

或者可能有人已经有了一个有效的解决方案来发布在这里


那太好了。谢谢大家的关注。

这里的挑战是找到在新列表中导航的正确测试。对于给定的列表项,我认为您正在搜索此类测试(不是很明显):

检查此转换

[XSLT1.0]

 <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
    <xsl:output indent="yes"/>
    <xsl:param name="pageid" select="4"/>

    <xsl:template match="/">
        <xsl:call-template name="Navigate"/>
    </xsl:template>

    <xsl:template name="Navigate">
        <ul>
            <xsl:apply-templates select="/cat/item" mode="Navigate"/>
        </ul>
    </xsl:template>

    <xsl:template match="item" mode="Navigate">
        <li>
            <xsl:apply-templates select="@id[.=$pageid]" mode="Navigate"/>
            <xsl:value-of select="@name"/>
            <xsl:if test="item and .//@id=$pageid">
                <ul>
                    <xsl:apply-templates select="item" mode="Navigate"/>
                </ul>
            </xsl:if>
        </li>
    </xsl:template>

    <xsl:template match="@id" mode="Navigate">
        <xsl:attribute name="class">
            <xsl:value-of select="'activeitem'"/>
        </xsl:attribute>
    </xsl:template>

</xsl:stylesheet>


  • $pageid=4的结果:

    <ul>
       <li>1<ul>
             <li>1.1</li>
             <li>1.2</li>
             <li>1.3</li>
             <li class="activeitem">1.4<ul>
                   <li>1.4.1</li>
                   <li>1.4.2</li>
                   <li>1.4.3</li>
                </ul>
             </li>
             <li>1.5</li>
             <li>1.6</li>
          </ul>
       </li>
       <li>2</li>
       <li>3</li>
    </ul>
    
    • 1
      • 1.1
      • 1.2
      • 1.3
      • 1.4
        • 1.4.1
        • 1.4.2
        • 1.4.3
      • 1.5
      • 1.6
    • 二,
    • 三,
    $pageid=7的结果:

    <ul>
       <li>1<ul>
             <li>1.1</li>
             <li>1.2</li>
             <li>1.3</li>
             <li>1.4<ul>
                   <li>1.4.1<ul>
                         <li>1.4.1.1</li>
                         <li class="activeitem">1.4.1.2</li>
                         <li>1.4.1.3</li>
                      </ul>
                   </li>
                   <li>1.4.2</li>
                   <li>1.4.3</li>
                </ul>
             </li>
             <li>1.5</li>
             <li>1.6</li>
          </ul>
       </li>
       <li>2</li>
       <li>3</li>
    </ul>
    
    • 1
      • 1.1
      • 1.2
      • 1.3
      • 1.4
        • 1.4.1
          • 1.4.1.1
          • 1.4.1.2
          • 1.4.1.3
        • 1.4.2
        • 1.4.3
      • 1.5
      • 1.6
    • 二,
    • 三,
    $pageid=13的结果:

    <ul>
       <li>1</li>
       <li class="activeitem">2<ul>
             <li>2.1</li>
             <li>2.2</li>
          </ul>
       </li>
       <li>3</li>
    </ul>
    
    • 一,
    • 2
      • 2.1
      • 2.2
    • 三,

    我认为逻辑是,如果一个项目将所选页面作为子项,或者是所选页面,那么您希望看到该项目的所有子项目

    这是我的尝试

    <?xml version="1.0"?>
    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
       <xsl:output method="xml" indent="yes"/>
       <xsl:param name="pageNum" select="13" />
    
       <xsl:template match="/cat">
          <ul>
             <xsl:apply-templates />
          </ul>
       </xsl:template>
    
       <xsl:template match="item">
          <li>
             <xsl:if test="@id=$pageNum">
                <xsl:attribute name="class">activeitem</xsl:attribute>
             </xsl:if>
             <xsl:value-of select="@name" />
             <xsl:choose>
                <xsl:when test="descendant-or-self::item[@id=$pageNum] and count(node()) > 0">
                   <ul>
                      <xsl:apply-templates />
                   </ul>
                </xsl:when>
             </xsl:choose>
          </li>
       </xsl:template>
    </xsl:stylesheet>
    
    
    
  • 活动项
  • 对于4和7,预期输出如问题所示。对于13,输出如下所示:

    <ul>
        <li>1</li>
        <li class="activeitem">2
            <ul>
                <li>2.1</li>
                <li>2.2</li>
            </ul>
        </li>
        <li>3</li>
    </ul>
    
    • 一,
    • 2
      • 2.1
      • 2.2
    • 三,

    我认为你的逻辑是正确的。我可能误解了这个要求+1我已经相应地修正了我的测试条件。当您只有一个测试时,为什么要使用
    xsl:choose
    ?@empo是的,您是正确的!当我开始写它时,我想我需要一个单独的条件来为后代和匹配项目本身。最后,我将这些测试合并为一个测试,但忽略了将其设置为xsl:ifAt。首先,我必须感谢您在@empo和Tim C中所做的工作,但我没有让它起作用。我需要一个版本,以包括由调用模板,而不是由分配夯实。empo的版本似乎只有在id按升序排列时才起作用。现在我尝试了类似的方法,但是我没有让真正的递归工作
            也许有一个带有“选择”部分的解决方案,或者针对每个部分。我以不同的方式尝试了这两种方法,但我只得到了垃圾或无限循环。@Eddy谢谢你的反馈,我相应地更新了问题。现在支持升序/降序,并将其调整为
            xsl:call-template
            。注意,我使用了模板模式来简化递归。非常感谢@empo!这个在工作