Subject: Re: [xsl] General algorithm for finding nodes between PIs From: "David Carlisle d.p.carlisle@xxxxxxxxx" <xsl-list-service@xxxxxxxxxxxxxxxxxxxxxx> Date: Fri, 27 Jan 2017 18:35:19 -0000 |
On 27 January 2017 at 18:21, Rick Quatro rick@xxxxxxxxxxxxxx <xsl-list-service@xxxxxxxxxxxxxxxxxxxxxx> 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.p.carlisle@xxxxxxxxx [mailto:xsl-list-service@xxxxxxxxxxxxxxxxxxxxxx] > Sent: Friday, January 27, 2017 11:51 AM > To: xsl-list@xxxxxxxxxxxxxxxxxxxxxx > 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>
Current Thread |
---|
|
<- Previous | Index | Next -> |
---|---|---|
Re: [xsl] General algorithm for fin, Rick Quatro rick@xxx | Thread | Re: [xsl] General algorithm for fin, Rick Quatro rick@xxx |
Re: [xsl] General algorithm for fin, Rick Quatro rick@xxx | Date | Re: [xsl] General algorithm for fin, Rick Quatro rick@xxx |
Month |