Найти элемент в выводе функции - PullRequest
1 голос
/ 05 декабря 2011

У меня есть две функции:

GetHomeXml() -> returns a collection of pages with a custom meta type
SiteMapXml() -> standard sitemap xml

SiteMapXml () имеет свойство (isCurrent), которое возвращается, если страница является текущей страницей.Мне нужно определить, отображается ли имя страницы в GetHomeXml () и есть ли у узла в GetHomeXml () свойство Image.FileName, назначенное для него.

Я могу получить оба возвращаемых значения, но не могу понятьиз XSL для достижения этой цели.Вот что у меня есть:

<xsl:param name="currentPage" select="/in:inputs/in:result[@name='SitemapXml']/Page/@iscurrent" />

<xsl:for-each select="/in:inputs/in:result[@name='GetHomeXml']/Image">
   <xsl:if test="@Image.PageTitle = $currentPage.Title">
      <img src="@Image.FileName" />
   </xsl:if>
</xsl:for-each>

Я создал пользовательскую запись метаданных и добавил в нее 3 поля {IsTab, Image, Color}.Я хочу определить, что если текущая страница содержит поле изображения и назначенный ему Page.Title, совпадает с текущей страницей, то для визуализации назначенного изображения (это поле ссылки на данные со свойством поиска изображения длякаталог изображений) в тег.

Но этот код, похоже, ничего не возвращает?

Обновление:

XML, возвращаемый для GetHomeXml() выглядит следующим образом:

<!-- Function Call Result (0 ms), XPath /in:inputs/in:result[@name='GetHomeXml']/IsTab -->
 <in:result name="GetHomeXml">
    <IsTab Id="9eba448e-9a30-478e-81b2-530bc7da2545" IsTab="true" BackgroundImg="MediaArchive:34f9be39-8273-4960-8cc6-e6b76f34e6ac" BackgroundImg.FileName="home-group-2.png" PageId.Title="Contact Us" xmlns=""/>
    <IsTab Id="a46e2e98-ffcd-4675-8840-389d1a7f46ca" IsTab="true" PageId.Title="Welcome" xmlns=""/>
    <IsTab Id="c76fa101-8c63-46e2-9431-e18ce875866d" IsTab="false" PageId.Title="What we do" xmlns=""/>

Я хочу получить имя изображения на основе текущей страницы (PageId.Title). Мне нужно сопоставить возвращенное значение, связанное с текущей страницей вSiteMapXml:

<!-- Function Call Result (0 ms), XPath /in:inputs/in:result[@name='SitemapXml']/Page -->
 <in:result name="SitemapXml">
     <Page Id="62c66cb6-b2ec-4469-b0d7-54bc61b22c20" Title="Home" MenuTitle="Home" UrlTitle="Home" Description="Default web site for... Please do not change any of the settings for this site. Add, modify and delete pages underneath this web site, but do no touch this site." ChangedDate="2011-12-04T22:36:33.2651194+02:00" ChangedBy="admin" URL="/Home/c1mode(unpublished)" Depth="1" xmlns="">
        <Page Id="041c7d66-60cd-4098-ac98-728c0db111a1" Title="Welcome" MenuTitle="Welcome" UrlTitle="Welcome" Description="" ChangedDate="2011-12-04T22:38:06.2815949+02:00" ChangedBy="admin" URL="/Home/Welcome/c1mode(unpublished)" Depth="2"/>
        <Page Id="8ae4d8a5-f4d9-43ed-85de-90b6d3a6f0b8" Title="Contact Us" MenuTitle="Contact Us" UrlTitle="Contact-Us" Description="" ChangedDate="2011-12-04T22:54:10.1503871+02:00" ChangedBy="admin" URL="/Home/Contact-Us/c1mode(unpublished)" isopen="true" iscurrent="true" Depth="2"/>
        <Page Id="ed5560a4-140b-4851-ac19-5ddc6c66a770" Title="What we do" MenuTitle="What we do" UrlTitle="What-we-do" Description="" ChangedDate="2011-11-28T07:23:25.8851421+02:00" ChangedBy="admin" URL="/Home/What-we-do/c1mode(unpublished)" Depth="2"/>
    </Page>
</in:result>
</in:result>

1 Ответ

2 голосов
/ 05 декабря 2011

Вместо циклического просмотра набора результатов используйте предикат xpath, чтобы сопоставить страницу по заголовку.Например, URL-адрес страницы приветствия будет задан следующим образом:

$pages[@Page.Title='Welcome']/@URL

Вот полный XSLT, в котором показаны URL-адреса для страниц HomeXML:

<xsl:param name="homeXml" select="/in:inputs/in:result[@name='GetHomeXml']/IsTab" />
<xsl:param name="sitemap" select="/in:inputs/in:result[@name='SitemapXml']/Page" />
<xsl:template match="/">
    <html>
        <head>
            <!-- markup placed here will be shown in the head section of the rendered page -->
        </head>
        <body>
            <xsl:for-each select="$homeXml">
                <xsl:variable name="pageTitle" select="@PageId.Title" />
                <xsl:variable name="sitemapPage" select="$sitemap//Page[@Title=$pageTitle]/@URL" />
                <xsl:value-of select="$sitemapPage" />
            </xsl:for-each>
        </body>
    </html>
</xsl:template>

СоответствующиеXsltCake (как JsFiddle, но для Xslt)

...