xsl-list
[Top] [All Lists]

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

2017-01-27 12:35:24
On 27 January 2017 at 18:21, Rick Quatro rick(_at_)rickquatro(_dot_)com
<xsl-list-service(_at_)lists(_dot_)mulberrytech(_dot_)com> wrote:
Hi David,

That works well, except I had to change this:

<xsl:when test="following-sibling::node()[1]/self::* and 
starts-with(.,'Condstart ')">

to this:

<xsl:when test="following-sibling::node()[1] and starts-with(.,'Condstart ')">

Thank you all for the help.

Rick

well...

following-sibling::node()[1]/self::*

tests that the node immediately following the Pi is an element.

and

following-sibling::node()[1]

is the same as

following-sibling::node()

in a boolean context and tests that the PI has any following sibling.

So I think my code is closer to what you said your requirements are,
but whatever works:-)

David


the second

-----Original Message-----
From: David Carlisle d(_dot_)p(_dot_)carlisle(_at_)gmail(_dot_)com 
[mailto:xsl-list-service(_at_)lists(_dot_)mulberrytech(_dot_)com]
Sent: Friday, January 27, 2017 11:51 AM
To: xsl-list(_at_)lists(_dot_)mulberrytech(_dot_)com
Subject: Re: [xsl] General algorithm for finding nodes between PIs

or sometimes it's easier with xslt- style sibling recursion rather then using 
for-each-group

Not sure I have all the cases but

<x>
 <p><?Fm Condstart USB?>If you need this, do that.<?Fm Condend USB?>text<?Fm  
Condstart foo?>Some text<?Fm Condend foo?>another text</p>

 <p><?Fm Condstart USB?><span>If you need</span>  <span>this, do 
that.</span><?Fm Condend USB?>text<?Fm  Condstart foo?>Some text<?Fm Condend 
foo?><span>another text</span></p> </x>


comes out as

<?xml version="1.0" encoding="UTF-8"?><x>  <p platform="USB">If you need 
this, do that.textSome textanother text</p>

 <p><span platform="USB">If you need</span>  <span platform="USB">this, do 
that.</span>textSome text<span>another text</span></p> </x>


using


<xsl:stylesheet version="2.0"
        xmlns:xsl="http://www.w3.org/1999/XSL/Transform";>



 <xsl:template match="node()">
  <xsl:param name="att"/>
  <xsl:copy>
   <xsl:copy-of select="$att"/>
   <xsl:apply-templates select="child::node()[1]"/>
  </xsl:copy>
  <xsl:apply-templates select="following-sibling::node()[1]">
   <xsl:with-param name="att" select="$att"/>
  </xsl:apply-templates>
 </xsl:template>

 <xsl:template match="processing-instruction(Fm)">
  <xsl:param name="att"/>
  <xsl:choose>
   <xsl:when test="following-sibling::node()[1]/self::text() and
           not(preceding-sibling::node()) and
           starts-with(.,'Condstart ')">
    <xsl:attribute name="platform" select="substring-after(.,'Condstart ')"/>
      <xsl:apply-templates select="following-sibling::node()[1]"/>
   </xsl:when>
   <xsl:when test="following-sibling::node()[1]/self::*
           and starts-with(.,'Condstart ')">
    <xsl:apply-templates select="following-sibling::node()[1]">
     <xsl:with-param name="att" as="attribute()">
      <xsl:attribute name="platform" select="substring-after(.,'Condstart 
')"/>
     </xsl:with-param>
    </xsl:apply-templates>
   </xsl:when>
   <xsl:when test="substring-after(.,'Condend ')=$att">
    <xsl:apply-templates select="following-sibling::node()[1]"/>
   </xsl:when>
   <xsl:otherwise>
    <xsl:apply-templates select="following-sibling::node()[1]">
     <xsl:with-param name="att" select="$att"/>
    </xsl:apply-templates>
   </xsl:otherwise>
  </xsl:choose>
 </xsl:template>

</xsl:stylesheet>

--~----------------------------------------------------------------
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>