1

我有两个功能:

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}。我想确定当前页面是否包含Image字段,并且分配给它的Page.Title与当前页面相同,以渲染指定的图像(它是一个数据引用字段,具有图像查找属性图像目录)进入标签。

但是这段代码似乎没有返回任何东西?

更新:

GetHomeXml() 返回的 XML 如下:

<!-- 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>
4

1 回答 1

2

不要循环遍历结果集,而是使用 xpath 谓词按标题匹配页面。例如,欢迎页面的 URL 将由以下方式给出:

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

这是一个完整的 XSLT,它显示了 HomeXML 页面的 URL:

<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)

于 2011-12-05T13:07:54.960 回答