help using XSLT in parsing nested xml trees

B

binary_sunset

Okay... so this may be all to obvious to all except myself, but I am
having some difficulty with XML output from Adobe InDesign. Each
separate article in my publication is tagged as an article, with a
component tree, but the articles all appear in the XML output as child
nodes of the previous article ala:

<article>
<title/>
<date/>
<body/>
<article>
<title/>
<date/>
<body/>
<article>
<title/>
<date/>
<body/>
</article>
</article>
</article>

The desired output from an XSLT would be something like three separate
files (easy) with the structure:

<article>
<title/>
<date/>
<body/>
</article>

or at least:

<article>
<title/>
<date/>
<body/>
</article>
<article>
<title/>
<date/>
<body/>
</article>
<article>
<title/>
<date/>
<body/>
</article>

So how do I parse the output? It looks like a recursive process, as
the number of nestings will vary with the number of articles in the
signature, and by magazine. The idea of attaching an attribute
<article id="n"> to each article occurred to me, but this changes the
workflow somewhat, as ids were to be established in post-processing,
rather than by hand.

Thanks.
Michael C.
Light Technology Publishing
 
P

p.lepin

<article>
<title/>
<date/>
<body/>
<article>
<title/>
<date/>
<body/>
<article>
<title/>
<date/>
<body/>
</article>
</article>
</article>

The desired output from an XSLT would be something like
three separate files (easy) with the structure:

Unless I'm much mistaken, XSLT1 cannot produce several
result trees in one pass. For that matter, I'm not sure it
can be done with EXSLT; and XSLT2 implementations are not
that common yet.
or at least:

<article>
<title/>
<date/>
<body/>
</article>
<article>
<title/>
<date/>
<body/>
</article>
<article>
<title/>
<date/>
<body/>
</article>

So how do I parse the output? It looks like a recursive
process, as the number of nestings will vary with the
number of articles in the signature, and by magazine. The
idea of attaching an attribute <article id="n"> to each
article occurred to me, but this changes the workflow
somewhat, as ids were to be established in
post-processing, rather than by hand.

Perhaps I'm missing something, but unnesting the structure
described seems trivial enough to me:

<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<unnested-articles>
<xsl:apply-templates select="//article"/>
</unnested-articles>
</xsl:template>
<xsl:template match="article">
<xsl:copy>
<xsl:apply-templates
select="@*|node()" mode="clone"/>
</xsl:copy>
</xsl:template>
<xsl:template match="@*|node()" mode="clone">
<xsl:copy>
<xsl:apply-templates
select="@*|node()" mode="clone"/>
</xsl:copy>
</xsl:template>
<xsl:template match="article" mode="clone"/>
</xsl:stylesheet>
 
S

Simon Brooke

in message <[email protected]>,
Okay... so this may be all to obvious to all except myself, but I am
having some difficulty with XML output from Adobe InDesign. Each
separate article in my publication is tagged as an article, with a
component tree, but the articles all appear in the XML output as child
nodes of the previous article ala:

<article>
<title/>
<date/>
<body/>
<article>
<title/>
<date/>
<body/>
<article>
<title/>
<date/>
<body/>
</article>
</article>
</article>

The desired output from an XSLT would be something like three separate
files (easy) with the structure:

<article>
<title/>
<date/>
<body/>
</article>

or at least:

<article>
<title/>
<date/>
<body/>
</article>
<article>
<title/>
<date/>
<body/>
</article>
<article>
<title/>
<date/>
<body/>
</article>

So how do I parse the output? It looks like a recursive process, as
the number of nestings will vary with the number of articles in the
signature, and by magazine. The idea of attaching an attribute
<article id="n"> to each article occurred to me, but this changes the
workflow somewhat, as ids were to be established in post-processing,
rather than by hand.

<xsl:template match="//article">
 
B

binary_sunset

Unless I'm much mistaken, XSLT1 cannot produce several
result trees in one pass. For that matter, I'm not sure it
can be done with EXSLT; and XSLT2 implementations are not
that common yet.




Perhaps I'm missing something, but unnesting the structure
described seems trivial enough to me:

<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<unnested-articles>
<xsl:apply-templates select="//article"/>
</unnested-articles>
</xsl:template>
<xsl:template match="article">
<xsl:copy>
<xsl:apply-templates
select="@*|node()" mode="clone"/>
</xsl:copy>
</xsl:template>
<xsl:template match="@*|node()" mode="clone">
<xsl:copy>
<xsl:apply-templates
select="@*|node()" mode="clone"/>
</xsl:copy>
</xsl:template>
<xsl:template match="article" mode="clone"/>
</xsl:stylesheet>

Great! Thanks... This looks like it will work for now, and I'm going
to pursue a dialogue with the folks at Adobe to see why the XML is
being formatted like that in the first place, and if there is a way to
configure it differently.

Much appreciated.
MC
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,769
Messages
2,569,582
Members
45,057
Latest member
KetoBeezACVGummies

Latest Threads

Top