我在基于 XML 的 CMS(现代校园)工作。 XSLT 仍然是我试图即时学习的东西,所以我还不熟悉这个领域。
我们的 CMS 正在使用以下代码构建博客提要(我们用于新闻):
<items>
<!--Internal News Articles-->
<xsl:for-each select="$internal-doc/items/item">
<xsl:sort select="concat(substring(pubDate,7,4), substring(pubDate,1,2),substring(pubDate,4,2))" order="descending"/>
<xsl:if test="not(articlePreview) or articlePreview != 'true'">
<item>
<xsl:apply-templates select="attribute()|node()" />
<searchtags>{string-join(tags/tag, ',')}</searchtags>
</item>
</xsl:if>
</xsl:for-each>
<!--External News Articles-->
<xsl:if test="$include-broadcast='true'"> <!--Check to see if broadcast option is on, if so, get external news articles-->
<xsl:for-each select="$array">
<xsl:variable name="external-doc" select="(.)" /> <!--Get current array item-->
<xsl:variable name="base-url" select="tokenize($external-doc, '/_resources')[1]" /> <!--Get website URL, need to use it for link to news and images-->
<xsl:for-each select="$external-doc/document(.)/items/item">
<xsl:sort select="concat(substring(pubDate,7,4), substring(pubDate,1,2),substring(pubDate,4,2))" order="descending"/>
<xsl:if test="contains(broadcast,$broadcast-unit)">
<item>
<xsl:attribute name="href" select="concat($base-url,@href)"/>
<xsl:apply-templates select="attribute()[not(name() = 'href')]|node()[not(name() = 'hero-image') and not(name() = 'image')]" />
<xsl:if test="image">
<image>
<xsl:choose>
<xsl:when test="not(contains(image/img/@src,'://'))">
<img>
<xsl:attribute name="src" select="concat($base-url,image/img/@src)"/>
<xsl:apply-templates select="image/img/attribute()[not(name() = 'src')]" />
</img>
</xsl:when>
<xsl:otherwise><xsl:apply-templates select="image/img" /></xsl:otherwise>
</xsl:choose>
</image>
</xsl:if>
<searchtags>{string-join(tags/tag, ',')}</searchtags>
</item>
</xsl:if>
</xsl:for-each>
</xsl:for-each>
</xsl:if>
</items>
代码运行良好 - 代码的后半部分查看外部博客提要,看看是否需要从中引入任何项目。这段代码也有效。我遇到的问题,或者不确定如何完成,是根据 pubDate 执行最终排序。按照目前的情况,当构建 feed 时,内部新闻文章会被排序,然后当添加外部新闻文章时,它们也会被排序,但两者都是单独排序的。我想要的是最终排序,这样如果外部新闻文章的日期碰巧比内部新闻文章的日期更新,它将出现在提要的顶部,而不是出现在提要的末尾,就像代码目前所做的那样。我怎样才能做到这一点?
正如马丁后来在他的第一个回复中提到的,你可以将它们放入一个变量中,然后再对它们进行排序。这可能是更好的选择的原因之一是两个循环对
$internal-doc
和 $external-doc
执行不同的操作。假设 $external-doc
是由另一个站点上的相同进程生成的,并且主要进行处理以将根相对 URL 转换为完整 URL。 $internal-doc
上的循环使用 <xsl:apply-templates ... />
处理从各个博客文章检索的 XML,并且可能对 XML 执行重大转换(并且循环处理 $external-doc
排除同一调用中的许多属性和元素)。
如果此提要仅在内部处理或由使用 Modern Campus CMS 的其他站点进行处理,则在处理资产/组件中输出的提要的代码中对它们进行排序可能会更容易,通常在
/_resources/dmc/php/blogs.php
或 中/App_Code/dmc_blogs.cs
(或/_resources/dmc/cs/blogs.ashx
)。如果要发布提要供外部使用或为了缓解可衡量的性能问题,我可能只会付出额外的努力在 XSLT 中对它们进行排序。