使用 XSLT 如何让我的输出重复而不是只返回第一个实例?
Posted
技术标签:
【中文标题】使用 XSLT 如何让我的输出重复而不是只返回第一个实例?【英文标题】:Using XSLT how can I get my output to repeat instead of only returning the first instance? 【发布时间】:2021-12-13 02:39:03 【问题描述】:我正在编写一个 XSLT 脚本来输出一个包含来自 XML 文件的数据的 html 表,但我的结果文档只在我需要每组时才给我第一组。
这是我的 XML:
<?xml version='1.0' encoding='UTF-8'?>
<!DOCTYPE map PUBLIC "-//KPE//DTD DITA KPE Map//EN" "kpe-map.dtd" []>
<map>
<title><ph conref="../../titles/sec_s63_title_l1.dita#sec_s63_title_l1/topic_title"/></title>
<topicref href="../questions/sec_question_00260_1.dita">
<topicsubject keyref="sec_s63_los_1"/>
</topicref>
<topicref href="../questions/sec_question_00260_2.dita">
<topicsubject keyref="sec_s63_los_1"/>
</topicref>
<topicref href="../questions/sec_question_00260_3.dita">
<topicsubject keyref="sec_s63_los_1"/>
</topicref>
</map>
这是我的 XSLT:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<xsl:apply-templates/>
</xsl:template>
<xsl:template match="/">
<html>
<body>
<h2></h2>
<table border="1">
<tr>
<td><xsl:value-of select="//topicref/@href"/></td>
<td><xsl:value-of select="//topicref/topicsubject/@keyref"/></td>
</tr>
</table>
</body>
</html>
</xsl:template>
</xsl:stylesheet>
这是我得到的输出:
<html>
<body>
<h2></h2>
<table border="1">
<tr>
<td>../questions/sec_question_00260_1.dita</td>
<td>sec_s63_los_1</td>
</tr>
</table>
</body>
</html>
这就是我想要得到的:
<html>
<body>
<h2></h2>
<table border="1">
<tr>
<td>../questions/sec_question_00260_1.dita</td>
<td>sec_s63_los_1</td>
</tr>
<tr>
<td>../questions/sec_question_00260_2.dita</td>
<td>sec_s63_los_1</td>
</tr>
<tr>
<td>../questions/sec_question_00260_3.dita</td>
<td>sec_s63_los_1</td>
</tr>
</table>
</body>
</html>
我的脚本在哪里关闭?提前感谢您的帮助!
【问题讨论】:
【参考方案1】:我想你想要一些类似的东西
<xsl:template match="/">
<html>
<body>
<h2></h2>
<table border="1">
<xsl:apply-templates/>
</table>
</body>
</html>
</xsl:template>
<xsl:template match="topicref">
<tr>
<td><xsl:value-of select="@href"/></td>
<td><xsl:value-of select="topicsubject/@keyref"/></td>
</tr>
</xsl:template>
【讨论】:
成功了!非常感谢!!最后一个问题,是否可以在没有../questions
的情况下返回第一个值,所以只有sec_question_00260_3.dita
显示?
@pantherfan,在 XSLT/XPath 2.0 中很容易,例如tokenize(@href, '/')[last()]
。但是您似乎使用 XSLT 1。
在 XSLT 1.0 中也不是很困难,尤其是。如果要删除的子字符串是常量:substring-after(@href, '../questions/')
【参考方案2】:
试试这个方法:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/map">
<html>
<body>
<h2></h2>
<table border="1">
<xsl:for-each select="topicref">
<tr>
<td><xsl:value-of select="@href"/></td>
<td><xsl:value-of select="topicsubject/@keyref"/></td>
</tr>
</xsl:for-each>
</table>
</body>
</html>
</xsl:template>
</xsl:stylesheet>
请参阅 XSLT 规范中的 Repetition 部分。
【讨论】:
以上是关于使用 XSLT 如何让我的输出重复而不是只返回第一个实例?的主要内容,如果未能解决你的问题,请参考以下文章
使用 XAMPP 服务器运行 python 文件只返回包含该程序的文件夹,而不是运行该程序 [重复]
SwiftUI:从另一个初始化程序调用它时,如何让我的闭包返回“内容”而不是“某些视图”?
如何让我的 discord.py 机器人只允许来自管理员和模组的 @everyone 和 @here,而不是来自普通成员的