使用 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,而不是来自普通成员的

转换时,XSLT不会创建正确的行数