* 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).