背景
希望将 XHTML 元数据转换为文档变量。
代码
零件包括:
- XHTML 元数据——包括用户定义的元数据
- XML 设置——应用 XML 过滤器
- 元数据设置——将设置转换为文档变量
- 文档变量——变量使用示例
各部分说明之后是一个简短、独立且可编译的示例。
XHTML 元数据
用户可以通过 GUI 提供任意文档元数据:
然后,用户可以将文档导出为 XHTML,这将生成以下示例 XHTML 标头:
<head>
<title>Heuristic View of Light</title>
<meta content="science, nature" name="keywords"/>
<meta content="Milena Marić Einstein" name="author"/>
<meta content="Albert Einstein" name="byline"/>
<meta content="4500" name="count"/>
<meta content="1905" name="copyright"/>
<meta content="Annalen der Physik" name="journal"/>
</head>
请注意,元数据名称将被清理以实现 TeX 兼容性。
XML 设置
在以下 XML 设置中,前四个具有“特殊”行为,但其余部分是相同的(保存名称):
\startxmlsetups xml:html
% special setups
\xmlfilter{#1}{/head/title/command(xml:title)}
\xmlfilter{#1}{/head/meta[@name='author']/command(xml:author)}
\xmlfilter{#1}{/head/meta[@name='byline']/command(xml:byline)}
\xmlfilter{#1}{/head/meta[@name='keywords']/command(xml:keywords)}
% virtually identical setups
\xmlfilter{#1}{/head/meta[@name='address']/command(xml:address)}
\xmlfilter{#1}{/head/meta[@name='phone']/command(xml:phone)}
\xmlfilter{#1}{/head/meta[@name='email']/command(xml:email)}
\xmlfilter{#1}{/head/meta[@name='count']/command(xml:count)}
\xmlflush{#1}
\stopxmlsetups
元数据设置
几乎相同的元数据值的设置遵循相同的模式:
% create email document variable
\startxmlsetups xml:email
\setupdocument[email={\xmlatt{#1}{content}}]
\stopxmlsetups
% create count document variable
\startxmlsetups xml:count
\setupdocument[count={\xmlatt{#1}{content}}]
\stopxmlsetups
文档变量
以下是文档变量的用法示例:
\startsetups document:start
\starttitlemakeup
\setupinterlinespace[line=14pt]
{%
\documentvariable{author}\hfill
\TextNumberFormat{\documentvariable{count}} words
}\break
\documentvariable{address}\break
\documentvariable{phone}\break
\documentvariable{email}\break
\vfill
\startalignment[middle]
\WORD{\documentvariable{title}}
\blank[big]
by
\blank[big]
\documentvariable{byline}
\stopalignment
\vfill
\stoptitlemakeup
\stopsetups
通过这种方式,用户可以在 GUI 中定义变量,然后使用\documentvariable{*}
宏引用它们。
南加州大学
这是一个演示该问题的独立示例:
\startbuffer[xdoc]
<html>
<head>
<meta content="Milena Marić Einstein" name="author"/>
<meta content="Annalen der Physik" name="journal"/>
</head>
<body>
</body>
</html>
\stopbuffer
\startxmlsetups xml:xhtml
\xmlsetsetup{\xmldocument}{*}{-}
\xmlsetsetup{\xmldocument}{html|body}{xml:*}
\xmlsetsetup{\xmldocument}{head}{xml:meta}
\stopxmlsetups
\xmlregistersetup{xml:xhtml}
\startxmlsetups xml:html
\xmlfilter{#1}{/head/meta[@name='author']/command(xml:author)}
% What goes here?
%\xmlfilter{#1}{/head/meta[@name='journal']/command(xml:journal)}
\xmlflush{#1}
\stopxmlsetups
\startxmlsetups xml:author
\setupdocument[author={\xmlatt{#1}{content}}]
\setupdocument[metadata:author={\xmlatt{#1}{content}}]
\setupinteraction[author={\documentvariable{author}}]
\stopxmlsetups
% How can this be generalized?
%\startxmlsetups xml:journal
%\setupdocument[journal={\xmlatt{#1}{content}}]
%\stopxmlsetups
\startxmlsetups xml:body
\startdocument
Author: \documentvariable{author}
\par
Journal: \documentvariable{journal}
\stopdocument
\stopxmlsetups
\xmlprocessbuffer{main}{xdoc}{}
问题
添加新的元数据值(字幕、卷、许可证、软件等)需要更新 XML 设置和元数据设置,这是我想要避免的步骤。
问题
name
给定一个具有任意元数据和属性的 XHTML 文档content
,如何为每个元数据名称自动定义文档变量?
也就是说,给定:
<meta content="Annalen der Physik" name="journal"/>
您如何确保使用:
\documentvariable{journal}
当两个杂志和物理学年鉴可以由用户任意定义?
答案1
从邮件列表中,基于 XHTML 元数据定义动态变量,如下所示:
\startxmlsetups xml:setdocumentvariable
\setupdocument[\xmlatt{#1}{name}={\xmlatt{#1}{content}}]
\stopxmlsetups
\startxmlsetups xml:author
\setupdocument[author={\xmlatt{#1}{content}}]
\setupdocument[metadata:author={\xmlatt{#1}{content}}]
\setupinteraction[author={\documentvariable{author}}]
\stopxmlsetups
\startxmlsetups xml:html
\xmlfilter{#1}{/head/meta/command(xml:setdocumentvariable)}
\xmlfilter{#1}{/head/meta[@name='author']/command(xml:author)}
\startdocument
\xmlflush{#1}
\stopdocument
\stopxmlsetups
请注意,通过首先调用xmlfilter
命令setdocumentvariable
,它提供了定制特定元数据变量的机会。