html - 用于在 HTML 中生成列表的 XSLT 通用模板
问题描述
我想编写一些通用模板来将节点集合转换为 HTML 列表。集合的每个元素都应该对应一个列表项。理想情况下我会写
<xsl:apply-templates select="..." mode="ul"/>
以及与选择中的各个元素匹配的模板,生成的 HTML 应如下所示
<ul>
<li>Transformation of first element in selection</li>
<li>Transformation of second element</li>
...
</ul>
即每一个的内容<li>
都是由一个非泛型模板生成的;但是列表结构本身是由通用结构生成的。问题是编写一个通用模板,为任何非空集合生成此列表结构,并且为空集合不输出。
我尝试了以下方法:
<xsl:template match="*" mode="ul">
<xsl:if test="count(*) > 0">
<ul>
<xsl:apply-templates select="*" mode="li"/>
</ul>
</xsl:if>
</xsl:template>
<xsl:template match="*" mode="li">
<li>
<xsl:apply-templates select="." />
</li>
</xsl:template>
但这不起作用:集合的每个元素都将单独成为<ul>
. 从概念上讲,我想要的是将集合本身转换为 a <ul>
,然后将集合的元素转换为单个<li>
s 的方法。
这里很重要:
非空集合的测试应该在泛型模板中,因为我不想用条件包装对这个模板的每次调用,也不想
<ul>
在集合为空时输出空元素。在我正在转换的 XML 文档中,集合中的元素通常没有共同的父级。这意味着我不能将父级转换为 the
<ul>
并将其子级转换为<li>
s;源文档中没有与<ul>
.
这可能吗?我所做的搜索越来越多地向我表明它不是,但这对我来说似乎很疯狂,因为这一定是一个非常常见的用例。
解决方案
在 XSLT 3.0(使用 XPath 3.1)中,您可以这样做
<xsl:apply-templates select="array{...}" mode="ul"/>
和
<xsl:template match="." mode="ul">
<ul>
<xsl:apply-templates select="?*" mode="li"/>
</ul>
</xsl:template>
<xsl:template match="*" mode="li">
<li>
<xsl:apply-templates select="." />
</li>
</xsl:template>
通过将您的“集合”包装到一个数组中,您可以使其成为一个单独的项目,并通过一次调用模板规则来匹配,该模板规则可以输出所需的<ul>
元素。
推荐阅读
- python - 如何在 pandas DataFrame 中找到每行的设置差异?
- google-chrome-extension - 匹配 URL 时更改弹出元素
- python - 在 Python 中打印 subprocess.Popen() 输出
- node.js - 来自 elasticsearch 的下一个和上一个文档
- javascript - 如何在用 HTML 编写的表单上设置排名系统,以使用 javascript 对总计算值进行排名
- python - 使用 python-sdk 调用时,航班优惠价格 API 返回内部错误
- sql - Teradata 动态选择
- c# - 如何在 c# 中将 2d 字符数组拆分为更小的数组?
- html - 如何预加载 svg 精灵?
- arrays - SwiftUI - 列出嵌套数组中的元素