我有一本 fb2 格式的书。我想打印目录,其中包含“部分”、“章节”、“剧集”等的名称和编号。
有没有办法可以从终端执行此操作?有一个类似的问题,但对于 epub 格式。
我知道 fb2 是一种 xml 格式。但是有没有一种工具可以只提取TOC?它们在标签<section>
,<title>
和内<subtitle>
。
如果没有,我想可以根据官方的FB2_to_txt.xsl文件制作 xsl 文件。也许ebook-convert可以做到这一点?
我正在写的书具有以下结构:
<?xml version="1.0" encoding="utf8"?>
<FictionBook xmlns:l="http://www.w3.org/1999/xlink" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns="http://www.gribuser.ru/xml/fictionbook/2.0">
<description>
<title-info>
<genre>fiction</genre>
<author>
<first-name>John</first-name>
<last-name>Doe</last-name>
</author>
<book-title>Fiction Book</book-title>
<annotation>
<p>Hello</p>
</annotation>
<keywords>john, doe, fiction</keywords>
<date value="2011-07-18">18.07.2011</date>
<coverpage></coverpage>
<lang>en</lang>
</title-info>
<document-info>
<author>
<first-name></first-name>
<last-name></last-name>
<nickname></nickname>
</author>
<program-used>Fb2 Gem</program-used>
<date value="2011-07-18">18.07.2011</date>
<src-url></src-url>
<src-ocr></src-ocr>
<id></id>
<version>1.0</version>
</document-info>
<publish-info>
</publish-info>
</description>
<body>
<title>
<p>John Doe</p>
<empty-line/>
<p>Fiction Book</p>
</title>
<section>
<title>
<p>Part 1</p>
<p>Some name of Part 1</p>
</title>
<section>
<title>
<p>Chapter 1</p>
<p>Some name of Chapter 1</p>
</title>
<subtitle>Episode 1</subtitle>
<p>Line one of the first episode</p>
<p>Line two of the first episode</p>
<p>Line three of the first episode</p>
<subtitle>Episode 2</subtitle>
<p>Line one of the second episode</p>
<p>Line two of the second episode</p>
<p>Line three of the second episode</p>
</section>
</section>
<section>
<title>
<p>Part 2</p>
<p>Some name of Part 2</p>
</title>
<section>
<title>
<p>Chapter 3</p>
<p>Some name of Chapter 3</p>
</title>
<subtitle>Episode 3</subtitle>
<p>Line one of the third episode</p>
<p>Line two of the third episode</p>
<p>Line three of the third episode</p>
<subtitle>Episode 4</subtitle>
<p>Line one of the fourth episode</p>
<p>Line two of the fourth episode</p>
<p>Line three of the fourth episode</p>
</section>
</section>
</body>
</FictionBook>
我想在输出中获得以下内容:
Part 1
Some name of Part 1
Chapter 1
Some name of Chapter 1
Episode 1
Episode 2
Part 2
Some name of Part 2
Chapter 3
Some name of Chapter 3
Episode 3
Episode 4
使用
xmlstarlet
:或者,使用短选项,
此处使用的 XPath 查询将提取每个 下节点
p
的节点值,以及所有节点的值。title
section
subtitle
_:
表达式中每个节点名称之前的前缀是文档正在使用的命名空间标识符的匿名占位符。给定您的示例文档,以上两个命令中的任何一个的输出将是
您是否还需要书名,然后删除
_:section
表达式中的限制(这将使书名的p
节点也匹配)。另一种获取每个部分的标题和副标题的方法(避免使用书名)可能看起来更简洁(因为它表明字幕是从各部分中提取的,而不仅仅是从任何地方提取的),是首先限制匹配到部分,然后从这些部分获取数据:
使用
XPath3
awareFOSS
(GPLv3) 命令行工具,xidel
:XPath2
构建序列:XPath1
:xidel
是查询 XML/HTML/JSON 的瑞士军刀。它足够聪明,可以namespace
自行管理默认值。在我看来,输出包含 XPath 表达式的结果
(//title/p | //subtitle)
。因此,您只需要找到适合您的环境的工具即可执行该 XPath 表达式并显示结果。有关一些建议的命令行工具,请参阅https://www.baeldung.com/linux/evaluate-xpath 。还有 Saxon 的 Gizmo 工具(我公司的产品)。