背景

背景

背景

希望将 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,它提供了定制特定元数据变量的机会。

相关内容