ntg-context - mailing list for ConTeXt users
 help / color / mirror / Atom feed
* xml attribute conditional
@ 2011-12-12 23:48 Jon Crump
  2011-12-13  9:33 ` Hans Hagen
  0 siblings, 1 reply; 7+ messages in thread
From: Jon Crump @ 2011-12-12 23:48 UTC (permalink / raw)
  To: ntg-context

All,

I have a conditional expression that checks to see if the current node
has any ancestor whose xml:id attribute matches a string

\xmldoifelse{#1}{ancestor::div[@xml:id='apr_engl']}

What I need is a test to see if the current node has any ancestor
whose xml:id attribute _contains_ a substring. Something like this:

\xmldoifelse{#1}{ancestor::div[ @xml:id contains('_engl')]}

trying this:
\xmldoifelse{#1}{ancestor::div[ contains(@xml:id, '_engl')]}

got me this error:
! LuaTeX error <    local expr = xml.expressions...>:3: bad argument
#1 to 'contains' (string expected, got nil)

any suggestions?

Jon
___________________________________________________________________________________
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://tex.aanhet.net
archive  : http://foundry.supelec.fr/projects/contextrev/
wiki     : http://contextgarden.net
___________________________________________________________________________________


^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: xml attribute conditional
  2011-12-12 23:48 xml attribute conditional Jon Crump
@ 2011-12-13  9:33 ` Hans Hagen
  2011-12-13 19:21   ` Jon Crump
  0 siblings, 1 reply; 7+ messages in thread
From: Hans Hagen @ 2011-12-13  9:33 UTC (permalink / raw)
  To: mailing list for ConTeXt users

On 13-12-2011 00:48, Jon Crump wrote:
> All,
>
> I have a conditional expression that checks to see if the current node
> has any ancestor whose xml:id attribute matches a string
>
> \xmldoifelse{#1}{ancestor::div[@xml:id='apr_engl']}
>
> What I need is a test to see if the current node has any ancestor
> whose xml:id attribute _contains_ a substring. Something like this:
>
> \xmldoifelse{#1}{ancestor::div[ @xml:id contains('_engl')]}
>
> trying this:
> \xmldoifelse{#1}{ancestor::div[ contains(@xml:id, '_engl')]}
>
> got me this error:
> ! LuaTeX error<     local expr = xml.expressions...>:3: bad argument
> #1 to 'contains' (string expected, got nil)
>
> any suggestions?

is there always an id? if not:

	@xml:id and contains(@xml:id,'_engl')

small test file needed

(you can run with \enabletrackers[xml.parse,xml.path] to see how it ends 
up)

Hans


-----------------------------------------------------------------
                                           Hans Hagen | PRAGMA ADE
               Ridderstraat 27 | 8061 GH Hasselt | The Netherlands
     tel: 038 477 53 69 | voip: 087 875 68 74 | www.pragma-ade.com
                                              | www.pragma-pod.nl
-----------------------------------------------------------------
___________________________________________________________________________________
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://tex.aanhet.net
archive  : http://foundry.supelec.fr/projects/contextrev/
wiki     : http://contextgarden.net
___________________________________________________________________________________


^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: xml attribute conditional
  2011-12-13  9:33 ` Hans Hagen
@ 2011-12-13 19:21   ` Jon Crump
  2011-12-14  0:02     ` Hans Hagen
  0 siblings, 1 reply; 7+ messages in thread
From: Jon Crump @ 2011-12-13 19:21 UTC (permalink / raw)
  To: Hans Hagen; +Cc: mailing list for ConTeXt users

Hans et alia,

Thanks for helping out with the right xpath expression. That was
indeed the problem: div elements in the ancestor axis that had no
xml:id attribute. Unfortunately, this doesn't solve my root problem.

I have a tei/xml marked up text with English and Arabic sections. For
each ref tag in the english section I want to place a \footnote. For
the corresponding ref in the Arabic section I want to place a \note
pointing to the same footnote as the corresponding English ref. The
minimal example appended below accomplishes this, but when I try to
apply this solution to my full text, this solution fails: I get ?? in
place of the references in the arabic, lua stats reports:

    mkiv lua stats  > cross referencing         - 56 identified, 56 unknown

and I get repeated errors of the following sort:

    xml             > lpath >          1 : ex :
@xml:id==string.sub('#N020-18', 2) ->
    (ll.at and ll.at['xml:id'])==string.sub('#N020-18', 2) ! Missing
number, treated as zero.

which is where, I presume, the ?? references are coming from

minimal example follows (\environment ara-sty not included)

Any insights you may have would be gratefully received.

Jon

(PS I suspect that the multiple errors associated with this problem
are what's causing --result renaming to fail)

xml input:
<body>
	<text>
		<div type='arText'>
		<p>
			<lb /> ين لنأخده <ref target="#N01"> للغاية تعيس </ref>
			<lb /> ين لنأخده <ref target="#N02"> شايلون شجوات </ref>
		</p>
		</div>
		<div type='enText'>
		<p>
			<lb /> some english <ref target="#N01">referenced text</ref>
			<lb /> more english <ref target="#N02">referenced text</ref>
		</p>
		</div>
		<div type='fnotes'>
			<note xml:id="N01">text for note ONE</note>
			<note xml:id="N02">text for note TWO</note>
		</div>
	</text>
</body>

context environment:
\startxmlsetups xml:lbsetups
	\xmlsetsetup{#1}{*}{-}
	\xmlsetsetup{#1}{body|text|div|p|lb|ref|note}{xml:*}
	\xmlsetsetup{#1}{div[@type='enText']}{xml:div:entext}
	\xmlsetsetup{#1}{div[@type='arText']}{xml:div:artext}
	\xmlsetsetup{#1}{div[@type='fnotes']}{xml:div:fnotes}
	\xmlsetsetup{#1}{ref}{xml:ref}
	\xmlsetsetup{#1}{note}{xml:note}
\stopxmlsetups
\setupfootnotes[location=text]
\xmlregistersetup{xml:lbsetups}
\environment ara-sty
\def\Size{12pt}
\enabletrackers[xml.parse,xml.path]

\startxmlsetups xml:body
	\xmlflush{#1}
\stopxmlsetups

\startxmlsetups xml:text
	\xmlflush{#1}
\stopxmlsetups

\startxmlsetups xml:div:entext
	\setlatin{\switchtobodyfont[palatino,\Size] \xmlflush{#1}}
\stopxmlsetups

\startxmlsetups xml:div:artext
	\setarabic{\switchtobodyfont[Arabic] \xmlflush{#1}}
\stopxmlsetups

\startxmlsetups xml:div:fnotes
	\placefootnotes
\stopxmlsetups

\startxmlsetups xml:ref
	\xmlflush{#1}
	\xmldoifelse{#1}{ancestor::div[@type='enText']}
		{\footnote[\xmlatt{#1}{target}]
			{\xmlfirst{#1}
				{root::/body/text/div[@type='fnotes']/note[@xml:id==string.sub('\xmlatt{#1}{target}',2)]}
			}
		}
		{\note[\xmlatt{#1}{target}]{}}		
\stopxmlsetups

\startxmlsetups xml:note
	\xmlflush{#1}\endgraf
\stopxmlsetups

~~~~~~~~~~~~
the ref tag setup that fails for my larger text looks like this:

\startxmlsetups xml:ref
	\xmlflush{#1}
	\xmldoifelse{#1}{ancestor::div[@xml:id and contains(@xml:id,
'apr_engl')]} %% this expression works
		{\footnote[\xmlatt{#1}{target}]
			{\xmlfirst{#1}
				{root::/TEI/text/back/div[@xml:id=='notes']/note[@xml:id==string.sub('\xmlatt{#1}{target}',
2)]}
			}
		}

		{
			{\note[\xmlatt{#1}{target}]}{} %% argument to \note results in ??
instead of corresponding ref. number
		}
\stopxmlsetups
___________________________________________________________________________________
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://tex.aanhet.net
archive  : http://foundry.supelec.fr/projects/contextrev/
wiki     : http://contextgarden.net
___________________________________________________________________________________

^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: xml attribute conditional
  2011-12-13 19:21   ` Jon Crump
@ 2011-12-14  0:02     ` Hans Hagen
  2011-12-14 18:33       ` Jon Crump
  0 siblings, 1 reply; 7+ messages in thread
From: Hans Hagen @ 2011-12-14  0:02 UTC (permalink / raw)
  To: Jon Crump; +Cc: mailing list for ConTeXt users

On 13-12-2011 20:21, Jon Crump wrote:

> @xml:id==string.sub('#N020-18', 2) ->
>      (ll.at and ll.at['xml:id'])==string.sub('#N020-18', 2) ! Missing
> number, treated as zero.

lua error with sub .. not sure what you want t o test here

indeed an error will prevent the multipass file to be saved (feature)

Hans


-----------------------------------------------------------------
                                           Hans Hagen | PRAGMA ADE
               Ridderstraat 27 | 8061 GH Hasselt | The Netherlands
     tel: 038 477 53 69 | voip: 087 875 68 74 | www.pragma-ade.com
                                              | www.pragma-pod.nl
-----------------------------------------------------------------
___________________________________________________________________________________
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://tex.aanhet.net
archive  : http://foundry.supelec.fr/projects/contextrev/
wiki     : http://contextgarden.net
___________________________________________________________________________________


^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: xml attribute conditional
  2011-12-14  0:02     ` Hans Hagen
@ 2011-12-14 18:33       ` Jon Crump
  2011-12-14 21:53         ` Hans Hagen
  0 siblings, 1 reply; 7+ messages in thread
From: Jon Crump @ 2011-12-14 18:33 UTC (permalink / raw)
  To: Hans Hagen; +Cc: mailing list for ConTeXt users

>> @xml:id==string.sub('#N020-18', 2) ->
>>     (ll.at and ll.at['xml:id'])==string.sub('#N020-18', 2) ! Missing
>> number, treated as zero.
>
>
> lua error with sub .. not sure what you want t o test here
>
> indeed an error will prevent the multipass file to be saved (feature)
>
>
> Hans

Thanks Hans, It's good to know the --result problem is not a bug, but
a feature. My problem then arises from my use of \note as opposed to
\footnote. In processing a <ref> tag in the xml, I need to test if the
current ref node has an ancestor <div> with attribute:
@xml:id='apr_engl'. If it does, I need to create a \footnote whose
text comes from a <note> element with attribute xml:id='N020-18', if
it does not, I need to create a \note whose reference number
corresponds to the one created by \footnote and thus points to the
same footnote contents:

<div xml:id='apr_arab'>
    <...>
        <ref target="#N020-18">referenced text</ref>
    <...>
</div>
<div xml:id='apr_engl'>
    <...>
        <ref target="#N020-18">referenced text</ref>
    <...>
</div>
...
<note xml:id='N020-18'>footnote contents</note>

To result in:

arabic text (1)
english text (1)
(1) footnote content

Currently I'm getting:

arabic text ??
english text (1)
(1) footnote content

Document order problem maybe?

thanks,
Jon
___________________________________________________________________________________
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://tex.aanhet.net
archive  : http://foundry.supelec.fr/projects/contextrev/
wiki     : http://contextgarden.net
___________________________________________________________________________________

^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: xml attribute conditional
  2011-12-14 18:33       ` Jon Crump
@ 2011-12-14 21:53         ` Hans Hagen
  2011-12-14 23:49           ` Jon Crump
  0 siblings, 1 reply; 7+ messages in thread
From: Hans Hagen @ 2011-12-14 21:53 UTC (permalink / raw)
  To: Jon Crump; +Cc: mailing list for ConTeXt users

On 14-12-2011 19:33, Jon Crump wrote:
>>> @xml:id==string.sub('#N020-18', 2) ->
>>>      (ll.at and ll.at['xml:id'])==string.sub('#N020-18', 2) ! Missing
>>> number, treated as zero.
>>
>>
>> lua error with sub .. not sure what you want t o test here
>>
>> indeed an error will prevent the multipass file to be saved (feature)
>>
>>
>> Hans
>
> Thanks Hans, It's good to know the --result problem is not a bug, but
> a feature. My problem then arises from my use of \note as opposed to
> \footnote. In processing a<ref>  tag in the xml, I need to test if the
> current ref node has an ancestor<div>  with attribute:
> @xml:id='apr_engl'. If it does, I need to create a \footnote whose
> text comes from a<note>  element with attribute xml:id='N020-18', if
> it does not, I need to create a \note whose reference number
> corresponds to the one created by \footnote and thus points to the
> same footnote contents:
>
> <div xml:id='apr_arab'>
>      <...>
>          <ref target="#N020-18">referenced text</ref>
>      <...>
> </div>
> <div xml:id='apr_engl'>
>      <...>
>          <ref target="#N020-18">referenced text</ref>
>      <...>
> </div>
> ....
> <note xml:id='N020-18'>footnote contents</note>
>
> To result in:
>
> arabic text (1)
> english text (1)
> (1) footnote content
>
> Currently I'm getting:
>
> arabic text ??
> english text (1)
> (1) footnote content
>
> Document order problem maybe?

probably a too complex solution ... this is an alternative:


\startbuffer[test]
<text>
     <div type='a'>
         a <ref target="#N01"> a </ref>
         a <ref target="#N02"> a </ref>
     </div>
     <div type='b'>
         b <ref target="#N01"> b </ref>
         b <ref target="#N02"> b </ref>
     </div>
     <div type='c'>
         <note xml:id="N01">ONE</note>
         <note xml:id="N02">TWO</note>
     </div>
</text>
\stopbuffer

\startxmlsetups xml:somesetups
	\xmlsetsetup{#1}{text|div|ref|note}{xml:*}
	\xmlsetsetup{#1}{div[@type='a']}{xml:div:a}
	\xmlsetsetup{#1}{div[@type='b']}{xml:div:b}
	\xmlsetsetup{#1}{div[@type='c']}{xml:div:c}
\stopxmlsetups

\xmlregistersetup{xml:somesetups}

\startluacode
     function document.preprocess()
         local notes = { }
         for e in lxml.collected("main","note") do
             notes[e.at["xml:id"]] = 0
         end
         for e in lxml.collected("main","ref") do
             local target = e.at["target"]
             if target then
                 local id = string.gsub(target,"^#","")
                 local n = notes[id]
                 if n then
                     n = n + 1
                     e.at.footnote = n
                     notes[id] = n
                     e.at["xml:id"] = id
                 end
             end
         end
     end
\stopluacode

\startxmlsetups xml:text
     \ctxlua{document.preprocess()}
     \xmlflush{#1}
\stopxmlsetups

\startxmlsetups xml:div:a
     \par[div a]\par
     \xmlflush{#1}
     \par[div a]\par
\stopxmlsetups

\startxmlsetups xml:div:b
     \par[div b]\par
     \xmlflush{#1}
     \par[div b]\par
\stopxmlsetups

% \startxmlsetups xml:div:c
%     \par[div c]\par
%     \xmlflush{#1}
%     \par[div c]\par
% \stopxmlsetups
%
% \startxmlsetups xml:note
% 	[note \footnote[\letterhash\xmlatt{#1}{xml:id}]{\xmlflush{#1}}]
% \stopxmlsetups
%
% \startxmlsetups xml:ref
% 	[ref : \note[\xmlatt{#1}{target}] ]
% \stopxmlsetups

\startxmlsetups xml:div:c
\stopxmlsetups

\startxmlsetups xml:note
\stopxmlsetups

\startxmlsetups xml:ref
     \doifsomething{\xmlatt{#1}{footnote}} {
         \doifelse{\xmlatt{#1}{footnote}} {1} {
             [footnote \footnote[\xmlatt{#1}{xml:id}]{\xmlflush{#1}}]
         } {
             [note \note[\xmlatt{#1}{xml:id}]{\xmlflush{#1}}]
         }
     }
\stopxmlsetups

\starttext
     \xmlprocessbuffer{main}{test}{}
\stoptext


(if it works ... wikify it)


-----------------------------------------------------------------
                                           Hans Hagen | PRAGMA ADE
               Ridderstraat 27 | 8061 GH Hasselt | The Netherlands
     tel: 038 477 53 69 | voip: 087 875 68 74 | www.pragma-ade.com
                                              | www.pragma-pod.nl
-----------------------------------------------------------------
___________________________________________________________________________________
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://tex.aanhet.net
archive  : http://foundry.supelec.fr/projects/contextrev/
wiki     : http://contextgarden.net
___________________________________________________________________________________


^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: xml attribute conditional
  2011-12-14 21:53         ` Hans Hagen
@ 2011-12-14 23:49           ` Jon Crump
  0 siblings, 0 replies; 7+ messages in thread
From: Jon Crump @ 2011-12-14 23:49 UTC (permalink / raw)
  To: Hans Hagen; +Cc: mailing list for ConTeXt users

Hans,

Thanks for this. It's almost what I need. I truly appreciate the
effort, and it does give me some ideas about things to try.

However, if I change your example buffer slightly (for clarity) to this:

<text>
   <div type='a'>
       arab <ref target="#N01"> foo </ref>
       arab <ref target="#N02"> bar </ref>
   </div>
   <div type='b'>
       english <ref target="#N01"> eggs </ref>
       english <ref target="#N02"> ham </ref>
   </div>
   <div type='c'>
       <note xml:id="N01"> note text ONE</note>
       <note xml:id="N02"> note text TWO</note>
   </div>
</text>

your code runs and gives me this:

[div a]
arab [footnote1] arab [footnote2]
[div a]
[div b]
english [note1 eggs ] english [note2 ham ]
[div b]
____
1 foo
2 bar

but what I'm trying for is this:

[div a]
arab [ foo1 ] arab [ bar2 ]
[div a]
[div b]
english [ eggs1 ] english [ ham2 ]
[div b]
____
1 note text ONE
2 note text TWO
___________________________________________________________________________________
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://tex.aanhet.net
archive  : http://foundry.supelec.fr/projects/contextrev/
wiki     : http://contextgarden.net
___________________________________________________________________________________

^ permalink raw reply	[flat|nested] 7+ messages in thread

end of thread, other threads:[~2011-12-14 23:49 UTC | newest]

Thread overview: 7+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2011-12-12 23:48 xml attribute conditional Jon Crump
2011-12-13  9:33 ` Hans Hagen
2011-12-13 19:21   ` Jon Crump
2011-12-14  0:02     ` Hans Hagen
2011-12-14 18:33       ` Jon Crump
2011-12-14 21:53         ` Hans Hagen
2011-12-14 23:49           ` Jon Crump

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).