构建 XML feed 后对项目进行排序?

问题描述 投票:0回答:1

我在基于 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 时,内部新闻文章会被排序,然后当添加外部新闻文章时,它们也会被排序,但两者都是单独排序的。我想要的是最终排序,这样如果外部新闻文章的日期碰巧比内部新闻文章的日期更新,它将出现在提要的顶部,而不是出现在提要的末尾,就像代码目前所做的那样。我怎样才能做到这一点?

xml xslt
1个回答
0
投票

正如马丁后来在他的第一个回复中提到的,你可以将它们放入一个变量中,然后再对它们进行排序。这可能是更好的选择的原因之一是两个循环对

$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 中对它们进行排序。

© www.soinside.com 2019 - 2024. All rights reserved.