Попытка написать навигацию с использованием XML / XSL - PullRequest
2 голосов
/ 02 июня 2011

Я пытаюсь написать навигацию с использованием XSL для преобразования XML.

Вот фрагмент XML-файла, который я использую:

<Menu>
<ID>22486a60-2bfe-46ba-96ee-7ea92b6ca5bb</ID>
<PageID>00000000-0000-0000-0000-000000000000</PageID>
<Link/>
<Target/>
<Title>Main Menu</Title>
<Image/>
<Items>
    <Menu>
        <ID>44595707-a331-49ae-a8ed-4bc1cef22e4f</ID>
        <PageID>83a1df5f-2909-4c8a-9aa7-a4f2e0111d7c</PageID>
        <Link>/home.aspx</Link>
        <Target>_self</Target>
        <Title>Home</Title>
        <Image/>
        <Items/>
    </Menu>
    <Menu>
        <ID>a9fd822b-838f-4129-9628-4ce667005450</ID>
        <PageID>88e8e3c3-39e3-40a4-9dfd-476f2082f4e0</PageID>
        <Link>/About-Us.aspx</Link>
        <Target>_self</Target>
        <Title>About Us</Title>
        <Image/>
        <Items/>
    </Menu>
    <Menu>
        <ID>3aa256eb-9f80-42b3-b637-2e22f7008adb</ID>
        <PageID>3369b394-1aec-4a9f-bb9f-1bae7bdde858</PageID>
        <Link>/Products.aspx</Link>
        <Target>_self</Target>
        <Title>Products</Title>
        <Image/>
        <Items>

            <Menu>
                <ID>b2f7efae-19d7-4177-9874-962944af9836</ID>
                <PageID>88e8e3c3-39e3-40a4-9dfd-476f2082f4e0</PageID>
                <Link>/Aprons.aspx</Link>
                <Target>_self</Target>
                <Title>Aprons</Title>
                <Image/>
                <Items/>
            </Menu>

У меня проблемы с отображением текущей страницы в XSL. Он отображает всех предков, но не текущую страницу. Вот что я придумала до сих пор:

    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:msxml="urn:schemas-microsoft-com:xslt">
    <xsl:output method="html" omit-xml-declaration="yes"/>
    <xsl:param name="CurrentPage">a5e2418a-f42e-4c0d-9d63-515ecb6af79e</xsl:param>

    <xsl:template match="/">
        <ul id="breadcrumb">
            <xsl:call-template name="innerNode">
                <!--<xsl:value-of select="ancestor-or-self::PageID = $CurrentPage"/>-->
            </xsl:call-template>
        </ul>
    </xsl:template>

    <xsl:template name="innerNode">
        <xsl:for-each select="Menu/Items">
            <xsl:if test="descendant::*/PageID = $CurrentPage">
                <li>
                    <xsl:choose>
                        <xsl:when test="not(PageID = $CurrentPage)">
                            <a href="/"><xsl:value-of select="../Title"/></a>
                        </xsl:when>
                        <xsl:otherwise>
                            <xsl:value-of select="Items"/>
                        </xsl:otherwise>
                    </xsl:choose>
                </li>
            </xsl:if>
            <xsl:call-template name="innerNode"/>
        </xsl:for-each>
    </xsl:template>
</xsl:stylesheet>

Любая помощь будет оценена!

Спасибо, Jason

1 Ответ

0 голосов
/ 02 июня 2011

Следующая таблица стилей сначала выбирает пункт меню с правильным идентификатором страницы, затем отображает всех его предков и, наконец, отображает сам пункт меню.Этот подход более эффективен, чем повторное вычисление выражения descendant::*.

. Обратите внимание, что если идентификатор страницы не существует в структуре меню, элемент ul не выводится.Если вы хотите отобразить элемент ul, даже если он будет пустым, измените таблицу стилей так, чтобы ul оборачивал xsl:for-each.

<xsl:stylesheet version="1.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="html" omit-xml-declaration="yes"/>
    <xsl:param name="CurrentPage">a5e2418a-f42e-4c0d-9d63-515ecb6af79e</xsl:param>

    <xsl:template match="/">
        <xsl:for-each select="//Menu[PageID = $CurrentPage]">
            <ul id="breadcrumb">
                <xsl:for-each select="ancestor::Menu">
                    <li><a href="{Link}"><xsl:value-of select="Title"/></a></li>
                </xsl:for-each>
                <li><xsl:value-of select="Title"/></li>
            </ul>
        </xsl:for-each>
    </xsl:template>

</xsl:stylesheet>
...