xsl-list
[Top] [All Lists]

Re: [xsl] General algorithm for finding nodes between PIs

2017-01-27 08:57:26
Thanks for the reply. What I really want is this:

Input:

<?xml version="1.0" encoding="UTF-8"?>
<info>
    <?Fm Condstart VbV-VCO?>
    <p>For this, use <b>that </b>to do that.</p>
    <p>Another paragraph</p>
    <?Fm Condend VbV-VCO?>
    <p><?Fm Condstart USB?>If you need this, do that.<?Fm Condend USB?></p>
    <p>Outside paragraph.</p>
</info>

Output:

<?xml version="1.0" encoding="UTF-8"?>
<info>
    <p platform="VbV-VCO">For this, use <b>that </b>to do that.</p>
    <p platform="VbV-VCO">Another paragraph</p>
    <p platform="USB">If you need this, do that.</p>
    <p>Outside paragraph.</p>
</info>

The basic logic is this: given a "Condstart" processing instruction:

* If the first sibling is an element, then assign an attribute to all
following sibling elements up to the corresponding Condend processing
instruction.

* If the first sibling is a text node, then assign an attribute to the
parent of the Condstart processing instruction.

I didn't phrase my question like this the first time because I wanted to
approach it in stages to try to understand how a solution would work. I
don't want to say "I have this" and "need that" and just copy/paste a
solution. I really want to understand what is happening in my style sheet.
Thanks for your generous help.

Rick

-----Original Message-----
From: Martin Honnen martin(_dot_)honnen(_at_)gmx(_dot_)de
[mailto:xsl-list-service(_at_)lists(_dot_)mulberrytech(_dot_)com] 
Sent: Friday, January 27, 2017 9:42 AM
To: xsl-list(_at_)lists(_dot_)mulberrytech(_dot_)com
Subject: Re: [xsl] General algorithm for finding nodes between PIs

On 27.01.2017 15:24, Rick Quatro rick(_at_)rickquatro(_dot_)com wrote:
I modified my input document slightly:

<?xml version="1.0" encoding="UTF-8"?> <info>
    <?Fm Condstart VbV-VCO?>
    <p>For this, use <b>that </b>to do that.</p>
    <?Fm Condend VbV-VCO?>
    <p><?Fm Condstart USB?>If you need this, do that.<?Fm Condend
USB?></p>
    <p>Outside paragraph.</p>
</info>

Here is how I have implemented Michael's stylesheet:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform";
      xmlns:xs="http://www.w3.org/2001/XMLSchema";
      exclude-result-prefixes="xs"
      version="2.0">
      
      <xsl:output indent="yes"/>

      <xsl:template match="/">
              <results>
                      <xsl:apply-templates/>
              </results>
      </xsl:template>
      
      <xsl:template match="*[processing-instruction('Fm')[starts-with(.,
'Condstart')]]">
              <xsl:for-each-group select="node()"
group-starting-with="processing-instruction('Fm')[starts-with(.,
'Condstart')]">
                      <xsl:if
test="self::processing-instruction('Fm')[starts-with(., 'Condstart')]">
                              <group name="{.}">
                                      <xsl:variable name="pi-end-name"
select="replace(., 'Condstart', 'Condend')"/>
                                      <xsl:for-each-group
select="current-group() except ."
group-ending-with="processing-instruction('Fm')[. = $pi-end-name]">
                                              <xsl:if
test="current-group()[last()][self::processing-instruction('Fm')[. = 
$pi-end-name]]">
                                                      <xsl:copy-of
select="current-group()[position() ne last()]"/>
                                              </xsl:if>
                                      </xsl:for-each-group>
                              </group>
                      </xsl:if>
              </xsl:for-each-group>
              <xsl:apply-templates/>
      </xsl:template>
      
      <xsl:template match="text()"/>
      
</xsl:stylesheet>

Here is my output:

<?xml version="1.0" encoding="UTF-8"?> <results>
   <group name="Condstart VbV-VCO">
      <p>For this, use <b>that </b>to do that.</p>
    </group>
   <group name="Condstart USB">If you need this, do that.</group> 
</results>

This is close, but I don't want to lose any elements from the output, 
like the parents of the processing instructions (<info>, <p>). Also, I 
am not picking up my last <p> element.

So which output do you want for that input sample? Do you want to generate
two documents, one containing the groups for the processing instructions,
the other copying the input, or do you want to mix the input with the
groups? In the last case, how exactly?

I am sure we can adapt the code once we know exactly which result you want,
but currently I am not sure how that result is supposed to look like.
--~----------------------------------------------------------------
XSL-List info and archive: http://www.mulberrytech.com/xsl/xsl-list
EasyUnsubscribe: http://lists.mulberrytech.com/unsub/xsl-list/1167547
or by email: xsl-list-unsub(_at_)lists(_dot_)mulberrytech(_dot_)com
--~--

<Prev in Thread] Current Thread [Next in Thread>