Greetings,

I'm typesetting an address book whose addresses are in XML. A typical entry
has this structure:

  <family surname="">
    <address street="" housenumber="" postcode="1" city=""  telephone="" />
    <members>
      <member first_name="" initials="" maiden_name="" birthday="" email=""
mobile="" />
      <member first_name="" initials="" birthday="" email="" mobile="" />
      <member first_name="" initials="" birthday="" />
    </members>
  </family>

initials and birthday are required, first_name can be left blank and email,
mobile and maiden_name are optional.

I've written a macro (name) to compose the name, i.e. initials, first_name
(maiden_name), and another macro (nameemaillink) to make the name a link
associated with an email address.

% Derive an individual's name
\def\name#1%
  {\ifxmlattempty{#1}{first_name} {\xmlatt{#1}{initials}} \else
{\xmlatt{#1}{initials}, \xmlatt{#1}{first_name}} \fi
   \ifxmlattempty{#1}{maiden_name} {} \else {
\tfxx(\xmlatt{#1}{maiden_name})} \fi}

% Create a mailto:link that associates a individual's name with their email
address.
\def\nameemaillink#1%
  {\ifxmlattempty{#1}{email} {\name{#1}} \else {\goto{\name{#1}}
[url(mailto:\xmlatt{#1}{email})]} \fi}

I thought I was done when I noticed that a composed name with an empty
first name, with or without an email address, is slightly indented. In the
mwe Moe and Curly, without first names, are indented; while Shemp and
Michael aren't.

That the undesired indentation/alignment is dependent on the presence of a
first name is baffling.  After this long description, if someone would look
at the code and tell me where I've gone wrong I would be very grateful. The
interesting bits begin on lines 8 and 12 in xml.tex.

-- 
With kind regards,

Michael
% XML processing instructions

% Turn a phone number into a tel:link - without spaces
\def\phonelink#1%
  {\goto{#1} [url(tel:\cldcontext{string.nospaces("#1")})]}

% Derive an individual's name
\def\name#1%
  {\ifxmlattempty{#1}{first_name} {\xmlatt{#1}{initials}} \else {\xmlatt{#1}{initials}, \xmlatt{#1}{first_name}} \fi
   \ifxmlattempty{#1}{maiden_name} {} \else { \tfxx(\xmlatt{#1}{maiden_name})} \fi}

% Create a mailto:link that associates a individual's name with their email address.
\def\nameemaillink#1%
  {\ifxmlattempty{#1}{email} {\name{#1}} \else {\goto{\name{#1}} [url(mailto:\xmlatt{#1}{email})]} \fi}

% Make an individual's mobile phone number a tel:link.
\def\mobilelink#1%
  {\ifxmlattempty{#1}{mobile} {} \else {\phonelink{\xmlatt{#1}{mobile}}} \fi}

% Track these several elements.
\startxmlsetups xml:list:base
  \xmlsetsetup{#1}{addressBook|family|address|members|member}{xml:list:*}
\stopxmlsetups

\xmlregisterdocumentsetup{list}{xml:list:base}

% When we encounter the root <addressBook> element merely flush the rest.
\startxmlsetups xml:list:addressBook
  \xmlflush{#1}
\stopxmlsetups

% Place each family in a frametext box
\startxmlsetups xml:list:family
  \startframedtext[width=\textwidth]
    {\tfb \bf \xmlatt{#1}{surname}\ifxmlattempty{#1}{prefix}{}\else{, \xmlatt{#1}{prefix}}\fi}\blank
    \xmlflush{#1}
  \stopframedtext
  \blank[big]
\stopxmlsetups

% Enumerate the address information
\startxmlsetups xml:list:address
  \xmlatt{#1}{street} \xmlatt{#1}{housenumber}\crlf
  \xmlatt{#1}{postcode} \xmlatt{#1}{city}\crlf
  \ifxmlattempty{#1}{telephone}{\vskip -1em}\else{\phonelink{\xmlatt{#1}{telephone}}}\fi
  %\vskip -1em
  \xmlflush{#1}
  \blank[big]
\stopxmlsetups

% The only purpose of the <members> element is to make a table of members.
\startxmlsetups xml:list:members
  \starttabulate[|l|l|l|]
    \xmlflush{#1}
  \stoptabulate
\stopxmlsetups

% Each <member> gets his own table row.
\startxmlsetups xml:list:member
  \NC \nameemaillink{#1} \NC \xmlatt{#1}{birthday} \NC \mobilelink{#1} \NC\NR
\stopxmlsetups

% finis
\environment xml.tex % XML processing instructions

\setupframedtext[frame=off, width=\textwidth, align={flushleft,broad,nothyphenated}]
\setupinteraction[state=start, color=darkblue]

\starttext
  \xmlprocessfile{list}{mwe.xml}{}
\stoptext

% finis
<?xml version="1.0" encoding="utf-8"?>

<addressBook>
  <family surname="Horwitz"> <!-- The Three Stooges -->
    <address street="Dorpstraat" housenumber="42" postcode="1234 AB" city="Hilversum"  telephone="0123 456789" />
    <members>
      <member first_name="Samuel" initials="S." birthday="17.03.1895" email="shemp@@stooges.com" mobile="0123456789" />	<!-- Shemp -->
      <member first_name="" initials="M."  birthday="19.06.1897" email="m...@stooges.com" mobile="0123456789"/>		<!-- Moe -->
      <member first_name="" initials="J." birthday="22.10.1903"  mobile="0123456789" />					<!-- Curly -->
      <member first_name="Michael" initials="M." birthday="09.03.1939" mobile="0123456789" />				<!-- Michael -->
    </members>
  </family>
</addressBook>

<!-- finis -->

Attachment: mwe.pdf
Description: Adobe PDF document

___________________________________________________________________________________
If your question is of interest to others as well, please add an entry to the 
Wiki!

maillist : ntg-context@ntg.nl / 
https://mailman.ntg.nl/mailman3/lists/ntg-context.ntg.nl
webpage  : https://www.pragma-ade.nl / https://context.aanhet.net (mirror)
archive  : https://github.com/contextgarden/context
wiki     : https://wiki.contextgarden.net
___________________________________________________________________________________

Reply via email to