如何使用 XSLT 将源文件中的单元和章节标签添加到输出文件?

How do I add unit and chapter tags from my source files to my output file using XSLT?

我正在使用 XSLT 脚本从源文件创建 ePub TOC。我能够获取 HTML 文件本身所需的内容,但我还需要包含 <unit><chapter> 标签。我不知道如何将它们放入我的输出文件中。

这是我的输入文件:

<?xml version="1.0" encoding="UTF-8"?>
<toc xmlns="http://www.standardnine.com/s9ml" data-uuid="c667450f8f7d45888630f13533a20e14">
    <metadata thumbnailpath="../img/toc_thumbs/.crops/9781506250953_7c4cbc8d37244424a9f2a00ab56b5db7.jpg">
        <remarks path="remarks.s9ml"/>
        <edition/>
        <title>SHSAT Course 2021</title>
        <author/>
        <publisher/>
        <shortname>sn_a9645</shortname>
        <pubdate>Publish Date</pubdate>
        <version>Version</version>
        <revision>Revision</revision>
        <s9version>s9version</s9version>
        <productid>Product ID</productid>
        <bundleconfig path="config.s9ml"/>
        <reflowable>true</reflowable>
        <subtitle/>
    </metadata>
    <spine>
        <unit designation="" enumeration="" data-uuid="f2aab3845c9d4e1988de8c6a22429af8">
            <title/>
            <chapter thumbnailpath="../img/toc_thumbs/.crops/9781506250953_56d8078f9660471799cb1741a3a45ade.jpg" designation="" enumeration="" data-uuid="c848cd9de0b646e1b3590904031e41f8" sandbox="true">
                <title>Front Matter</title>
                <exhibit path="frontmatter/fm_cover.html"/>
                <exhibit path="frontmatter/fm_titlepage.html"/>
                <exhibit path="frontmatter/copyright.html"/>
            </chapter>
        </unit>
        <unit designation="Section" enumeration="1" data-uuid="d1ff46bfa6fe47dda6f27a9d871eb727">
            <title>Getting Started</title>
            <chapter thumbnailpath="../img/toc_thumbs/ch01_thumb.png" designation="Chapter" enumeration="1" data-uuid="6f33bec0993d4133b75e4bd9b3902ef8" sandbox="false">
                <title>SHSAT Basics</title>
                <exhibit path="chapter01/ch01_part.html"/>
                <exhibit path="chapter01/ch01_reader_0.html"/>
            </chapter>
            <chapter thumbnailpath="../img/toc_thumbs/ch02_thumb.png" designation="Chapter" enumeration="2" data-uuid="2bf06864e6264270843990fe377ecb41" sandbox="false">
                <title>Inside the SHSAT</title>
                <exhibit path="chapter02/ch02_reader_0.html"/>
                <exhibit path="chapter02/ch02_reader_1.html"/>
            </chapter>
        </unit>
    </spine>
</toc>

这是我的 XSLT 脚本:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    xmlns:math="http://www.w3.org/2005/xpath-functions/math"
    xmlns:xd="http://www.oxygenxml.com/ns/doc/xsl" 
    xmlns:xhtml="http://www.w3.org/1999/xhtml"
    xmlns:s9ml="http://www.standardnine.com/s9ml" exclude-result-prefixes="xs math xd xhtml s9ml" 
    xmlns:epub="http://www.idpf.org/2007/ops"
    version="3.0">
    
    
    <xsl:output method="xhtml"/>
    
    <xsl:param name="topicPrefix"/>
    
    <xsl:template match="/">
        <html xmlns="http://www.w3.org/1999/xhtml">
        <head>
        
        <title>EPUB 3 Specifications - Table of Contents</title>
        <link rel="stylesheet" type="text/css" href="../css/epub-spec.css" />
    </head>
    <body>
        <nav epub:type="toc" id="toc">
            <h1 class="title">Table of Contents</h1>
            <ol>
                <xsl:apply-templates select="//s9ml:exhibit" />
            </ol>
        </nav>
    </body>
        </html>
    </xsl:template>
   
    <!-- process exhibits referenced from toc.s9ml -->
    <xsl:template match="s9ml:exhibit">
        <xsl:element name="li" namespace="http://www.w3.org/1999/xhtml">
            
                <xsl:variable name="count" select="position()"/>
                <xsl:attribute name="id">
                    <xsl:value-of select="$topicPrefix"/>
                    <xsl:number format="0000" level="any"/>
                </xsl:attribute>
            
            <xsl:element name="a"  namespace="http://www.w3.org/1999/xhtml">
                    <xsl:attribute name="href">
                        <xsl:value-of select="@path" />
                    </xsl:attribute>        
                    <xsl:apply-templates select="document(@path)//xhtml:title"> 
                        
                    </xsl:apply-templates>
                    </xsl:element>
                </xsl:element> 
    </xsl:template>
     
</xsl:stylesheet>

这是我得到的输出:

<?xml version="1.0" encoding="UTF-8"?><html xmlns="http://www.w3.org/1999/xhtml" xmlns:epub="http://www.idpf.org/2007/ops">
   <head>
      <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
      <title>EPUB 3 Specifications - Table of Contents</title>
      <link rel="stylesheet" type="text/css" href="../css/epub-spec.css" />
   </head>
   <body>
      <nav epub:type="toc" id="toc">
         <h1 class="title">Table of Contents</h1>
         <ol>
            <li id="0001"><a href="frontmatter/fm_cover.html">Cover</a></li>
            <li id="0002"><a href="frontmatter/fm_titlepage.html">Title Page</a></li>
            <li id="0003"><a href="frontmatter/copyright.html">Copyright</a></li>
            <li id="0004"><a href="chapter01/ch01_part.html">Section 1: Getting Started</a></li>
            <li id="0005"><a href="chapter01/ch01_reader_0.html">SHSAT Basics</a></li>
            <li id="0006"><a href="chapter02/ch02_reader_0.html">Inside the SHSAT</a></li>
            <li id="0007"><a href="chapter02/ch02_reader_1.html">Structure of the Test</a></li>
         </ol>
      </nav>
   </body>
</html>

这是我需要的输出是:

<?xml version="1.0" encoding="UTF-8"?>
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:epub="http://www.idpf.org/2007/ops">
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
        <title>EPUB 3 Specifications - Table of Contents</title>
        <link rel="stylesheet" type="text/css" href="../css/epub-spec.css" />
    </head>
    <body>
        <nav epub:type="toc" id="toc">
            <h1 class="title">Table of Contents</h1>
            <ol>
                <li>Front Matter <ol>
                        <li id="0001"><a href="frontmatter/fm_cover.html">Cover</a></li>
                        <li id="0002"><a href="frontmatter/fm_titlepage.html">Title Page</a></li>
                        <li id="0003"><a href="frontmatter/copyright.html">Copyright</a></li>
                    </ol>
                </li>
                <li>Section 1 Getting Started <ol>
                        <li>Chapter 1 SHSAT Basics <ol>
                                <li id="0004"><a href="chapter01/ch01_part.html">Section 1: Getting
                                        Started</a></li>
                                <li id="0005"><a href="chapter01/ch01_reader_0.html">SHSAT
                                        Basics</a></li>
                            </ol>
                        </li>

                        <li>Chapter 2 Inside the SHSAT <ol>
                                <li id="0006"><a href="chapter02/ch02_reader_0.html">Inside the
                                        SHSAT</a></li>
                                <li id="0007"><a href="chapter02/ch02_reader_1.html">Structure of
                                        the Test</a></li>
                            </ol>
                        </li>
                    </ol>
                </li>
            </ol>
        </nav>
    </body>
</html>

听起来好像要开始处理<xsl:apply-templates select="//s9ml:unit"/>而不是<xsl:apply-templates select="//s9ml:exhibit" />,然后写一个模板

<xsl:template mmatch="s9ml:unit | s9ml:chapter">
  <li>
    <xsl:value-of select="s9ml:title"/>
    <ol>
      <xsl:apply-templates select="node() except s9ml:title"/>
    </ol>
  </li>
</xsl:template>

确保您获得嵌套的有序列表的层次结构。

整个代码片段假定您要输出 XHTML 结果元素,因此在 xsl:stylesheet 根元素上声明了 xmlns="http://www.w3.org/1999/xhtml"