I found the solution I was looking for. The command to run is still

context --environment=nested-xmlsetup.tex --forcexml nested-xmlsetup.xhtml

In the <script> element there's some tex code, which redefines the xmlsetups for <p> and <i> elements, coloring the first ones in red and the second ones in blue.

The key command is

\xmlsetsetup{\xmldocument}{p|i}{myHtml:*}

where \xmldocument instead of #1 applies the myHtml:* setups to the whole XHTML document and not only to the <script> element identified by #1.

I tried also this, to prevent redefining the setups of <html>, <head>, <script> elements:

\xmlsetsetup{\xmlfirst{\xmldocument}{body}}{p|i}{myHtml:*}

but it doesn't work, since \xmldocument seems to be the actual document instead of an id pointing to its root element.

Massi

Il 10/03/22 17:52, Hans Hagen ha scritto:
On 3/10/2022 4:59 PM, mf via ntg-context wrote:
Hello,
I'm trying to add new templates (xmlsetups) from the XML document itself.

See the attached MWE.

- the XML document is a simple XHTML file

- in the "head" element there's a "script" element with the "type" attribute set to "text/vnd.context", whose contents are then passed to \xmlcontext

- the "body" element has a "data-xmlsetups" attribute whose value should tell which xmlsetups is to be applied on the body contents (it's defined in the "script" element above)

If it worked, the resulting PDF should show the body element, followed by a "Hello world!" paragraph written in red. But it does not work, because there's something I'm missing in the redefinition and application of xmlsetups.

To try the MWE, type:

context --environment=nested-xmlsetup.tex --forcexml nested-xmlsetup.xhtml
     <script type="text/vnd.context">
       \startxmlsetups myHtml
        \xmlsetsetup{#1}{p}{myHtml:p}
        % you're missing this
        \xmlsetup{#1}{xml:process}
        % which is
        %  \xmlregistereddocumentsetups{#1}{#1}
        %  \xmlmain{#1}
       \stopxmlsetups

       \startxmlsetups myHtml:p
          \dontleavehmode\red\xmlflush{#1}\par
       \stopxmlsetups
     </script>

Attachment: nested-xmlsetup.xhtml
Description: application/xhtml

\startxmlsetups html
  \xmlsetsetup{#1}{{html|head}}{html:flush}
  \xmlsetsetup{#1}{{html head script}}{html:script:context}
  \xmlsetsetup{#1}{{html body}}{html:body}
  \xmlsetsetup{#1}{p|i}{html:*}
\stopxmlsetups

\startxmlsetups html:flush
  \xmlflush{#1}
\stopxmlsetups

\startluacode
function xml.functions.parseScript(s)
  local mimetype = s and s.at and s.at.type
  if mimetype and mimetype == "text/vnd.context" then
    lxml.context(s)
  end
end
\stopluacode

\startxmlsetups html:script:context
  \xmlfunction{#1}{parseScript}
\stopxmlsetups

\startxmlsetups html:body
  \starttext
    \xmlflush{#1}
  \stoptext
\stopxmlsetups

% default setup for paragraphs
\startxmlsetups html:p
  \dontleavehmode\xmlflush{#1}\par
\stopxmlsetups

% default setup for italic inlines
\startxmlsetups html:i
  {\it\xmlflush{#1}}%
\stopxmlsetups

\xmlregistersetup{html}
___________________________________________________________________________________
If your question is of interest to others as well, please add an entry to the 
Wiki!

maillist : ntg-context@ntg.nl / http://www.ntg.nl/mailman/listinfo/ntg-context
webpage  : http://www.pragma-ade.nl / http://context.aanhet.net
archive  : https://bitbucket.org/phg/context-mirror/commits/
wiki     : http://contextgarden.net
___________________________________________________________________________________

Reply via email to