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 ...
我希望任何人都可以帮助解决这个问题..
你有几个错误:
- 您没有考虑来源 XML 的命名空间。
- 您正在处理
metadata
元素,而不是它的子元素。
- 您需要标点符号,但没有指定任何标点符号。
尝试:
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> </xsl:text>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
我想使用 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 ...
我希望任何人都可以帮助解决这个问题..
你有几个错误:
- 您没有考虑来源 XML 的命名空间。
- 您正在处理
metadata
元素,而不是它的子元素。 - 您需要标点符号,但没有指定任何标点符号。
尝试:
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> </xsl:text>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>