XSL 提取 epub 元数据

XSL to extract epub-metadata

我想使用 xsl 从 epub 书籍的 opf 文件中提取现有元数据。

opf 文件示例:

<?xml version="1.0" encoding="UTF-8" ?>
<package xmlns="http://www.idpf.org/2007/opf" xmlns:dc="http://purl.org/dc/elements/1.1/" unique-identifier="db-id" version="3.0">

<metadata>
    <dc:title id="t1">TITLE</dc:title>
    <dc:identifier id="db-id">ISBNUUID</dc:identifier>
    <dc:creator id="creator">CREATOR</dc:creator>
    <dc:language>LANGUAGE</dc:language>
    <meta property="dcterms:modified">DATETIME</meta>
    <dc:language>en</dc:language>
</metadata>

<manifest>
    <item id="toc" properties="nav" href="toc.xhtml" media-type="application/xhtml+xml" />
    <item id="ncx" href="toc.ncx" media-type="application/x-dtbncx+xml" />
    <item id="template_css" href="template.css" media-type="text/css" />
    <item id="hello" href="1_hello.xhtml" media-type="application/xhtml+xml" />
</manifest>

<spine toc="ncx">
    <itemref idref="hello" />
</spine>

</package>

我需要像这样提取对 <nodename>: <nodevalue>

title: TITLE
identifier: ISBNUUID
...

但似乎甚至无法正确处理这些节点。而且我不确定命名空间..

我的 xsl 现在看起来像这样:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="text"/>
  <xsl:template match="metadata">
    <xsl:value-of select="name(.)"/>
    <xsl:value-of select="."/>
  </xsl:template>
</xsl:stylesheet>

Xmlstarlet 仅生成节点值和大量空字符串:

$ xmlstarlet tr select-opds-metadata.xsl ../s3opdsd/epubgen/var/epub-boilerplate/OEBPS/content.opf


    TITLE
    ISBNUUID
    CREATOR
    LANGUAGE
    DATETIME
    en

... truncated ...

我希望任何人都可以帮助解决这个问题..

你有几个错误:

  1. 您没有考虑来源 XML 的命名空间。
  2. 您正在处理 metadata 元素,而不是它的子元素。
  3. 您需要标点符号,但没有指定任何标点符号。

尝试:

XSLT 1.0

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:o="http://www.idpf.org/2007/opf" >
<xsl:output method="text"/>

<xsl:template match="/o:package">
    <xsl:for-each select="o:metadata/*">
        <xsl:value-of select="local-name(.)"/>
        <xsl:text>: </xsl:text>
        <xsl:value-of select="."/>
        <xsl:text>&#10;</xsl:text>
    </xsl:for-each>
</xsl:template>

</xsl:stylesheet>