gpt4 book ai didi

xslt - 使用 xslt 构建列表

转载 作者:行者123 更新时间:2023-12-02 06:45:44 25 4
gpt4 key购买 nike

我正在尝试构建一个列表来解析我的整个 xml 文档。我需要列出数字名称,然后列出字母名称。该列表应如下所示。

6
6600 Training
6500 Training

A
Accelerated Training

T
Training

这是 xml 的一个片段。

<courses>
<course>
<name>Accelerated Training</name>
</course>
<course>
<name>6600 Training</name>
</course>
<course>
<name>Training</name>
</course>
<course>
<name>6500 Training</name>
</course>

</courses>

这是我目前使用的代码。我在网站上的另一个问题中发现了这一点,并对其进行了一些定制。目前它没有考虑到我对按数字解析的需求,而且它也没有按字母顺序返回。

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 

<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:variable name="vLower" select= "'abcdefghijklmnopqrstuvwxyz'"/>
<xsl:variable name="vUpper" select= "'ABCDEFGHIJKLMNOPQRSTUVWXYZ'"/>

<xsl:key name="kTitleBy1stLetter" match="courses/course" use="substring(name,1,1)"/>

<xsl:template match="/*">

<xsl:for-each select="course [generate-id() = generate-id(key('kTitleBy1stLetter', substring(name,1,1)) [1] ) ]">
<xsl:variable name="v1st" select="substring(name,1,1)"/>
<h2><xsl:value-of select="$v1st"/></h2>
<div class="{translate($v1st, $vUpper, $vLower)}-content">
<ul>
<xsl:for-each select="key('kTitleBy1stLetter',$v1st)">
<li><xsl:value-of select="name"/></li>
</xsl:for-each>
</ul>
</div>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>

最佳答案

基本上您需要按首字母分组并按 <name> 排序.您已经很好地采用了 Muenchian 分组方法。

我会建议一个更容易接受的替代方案:

<xsl:key name="kInitial" match="course" use="substring(name, 1, 1)" />

<xsl:template match="courses">
<xsl:apply-templates select="course" mode="initial">
<xsl:sort select="name" />
</xsl:apply-templates>
</xsl:template>

<xsl:template match="course" mode="initial">
<xsl:variable name="initial" select="substring(name, 1, 1)" />
<xsl:variable name="courses" select="key('kInitial', $initial)" />
<xsl:if test="generate-id() = generate-id($courses[1])">
<h2><xsl:value-of select="$initial"/></h2>
<ul>
<xsl:apply-templates select="$courses">
<xsl:sort select="name" />
</xsl:apply-templates>
</ul>
</xsl:if>
</xsl:template>

<xsl:template match="course">
<li>
<xsl:value-of select="name"/>
</li>
</xsl:template>

输出:

<h2>6</h2>
<ul>
<li>6500 Training</li>
<li>6600 Training</li>
</ul>
<h2>A</h2>
<ul>
<li>Accelerated Training</li>
</ul>
<h2>T</h2>
<ul>
<li>Training</li>
</ul>

编辑:为了便于阅读,我省略了第一个字母的大写字母。正确的键是这个(你不能在键中使用变量,因此不能使用文字字母字符串):

<xsl:key name="kInitial" match="course" use="
translate(
substring(name, 1, 1),
'abcdefghijklmnopqrstuvwxyz',
'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
)
" />

对于 $initial 当然也是如此第二个模板中的变量,但实际上您可以在这里再次使用变量。

编辑 #2:由于排序也区分大小写,您可以使用相同的表达式:

<xsl:sort select="translate(substring(name, 1, 1), $vLower, $vUpper)" />

关于xslt - 使用 xslt 构建列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/734946/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com