How can I make my reg exp less greedy? - regex

I'm trying select a small porting of the XML below but my reg exp doesn't work as expected.
My reg exp
<w:p [^<>]*><w:r><w:t>\[end participant\]<\/w:t><\/w:r><\/w:p>
It should match
<w:p w:rsidRDefault="009C141F" w:rsidP="006003BD">
<w:pPr>
<w:spacing w:after="240" />
</w:pPr>
<w:r>
<w:t>[end participant]</w:t>
</w:r>
</w:p>
But it matches up to the first w:p tag.
Here is the complete XML
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<w:document xmlns:ve="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships" xmlns:m="http://schemas.openxmlformats.org/officeDocument/2006/math" xmlns:v="urn:schemas-microsoft-com:vml" xmlns:wp="http://schemas.openxmlformats.org/drawingml/2006/wordprocessingDrawing" xmlns:w10="urn:schemas-microsoft-com:office:word" xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main" xmlns:wne="http://schemas.microsoft.com/office/word/2006/wordml">
<w:body>
<w:p w:rsidRDefault="001660DB" w:rsidP="001660DB">
<w:pPr>
<w:pStyle w:val="Titre1" />
<w:spacing w:before="0" />
</w:pPr>
<w:r>
<w:t>Salut</w:t>
</w:r>
</w:p>
<w:p w:rsidRDefault="001660DB" w:rsidP="001660DB">
<w:pPr>
<w:pStyle w:val="Titre2" />
<w:spacing w:before="0" />
</w:pPr>
<w:r>
<w:t>Hello les gens &àè!</w:t>
</w:r>
</w:p>
<w:p w:rsidRDefault="00F87349" />
<w:p w:rsidRDefault="009C141F">
<w:r>
<w:t>[start participant]</w:t>
</w:r>
</w:p>
<w:p w:rsidRDefault="009C141F" w:rsidP="006003BD">
<w:pPr>
<w:pStyle w:val="Titre1" />
<w:spacing w:before="0" w:after="240" />
</w:pPr>
<w:r>
<w:t xml:space="preserve">Mr #NOM# #PRENOM#</w:t>
</w:r>
</w:p>
<w:p w:rsidRDefault="009C141F" w:rsidP="006003BD">
<w:pPr>
<w:spacing w:after="240" />
</w:pPr>
<w:r>
<w:t>[end participant]</w:t>
</w:r>
</w:p>
<w:sectPr w:rsidSect="00425138">
<w:pgSz w:w="11906" w:h="16838" />
<w:pgMar w:top="1417" w:right="1417" w:bottom="1417" w:left="1417" w:header="708" w:footer="708" w:gutter="0" />
<w:cols w:space="708" />
<w:docGrid w:linePitch="360" />
</w:sectPr>
</w:body>
</w:document>
thanks

I think you're missing the tag for spacing:
<w:p [^<>]*><w:pPr><w:spacing [^<>]*/></w:pPr><w:r><w:t>\[end participant\]<\/w:t><\/w:r><\/w:p>

Related

How can convert the nested section DOCX file in to the XML using - XSLT

How can convert DOCX section style (e.g. Titre-niv1,Titre-niv2, Titre-niv3) and (e.g. Paragraphesimple style into the Paragraphenum-Titrenoy) convert to XML nested section and para XML.
Input
<root xmlns:w="www.ap">
<w:p w:rsidR="00A13CB1" w:rsidRDefault="000F7DF9" w:rsidP="00AE46E9">
<w:pPr>
<w:pStyle w:val="Titre-niv1"/>
</w:pPr>
<w:r w:rsidRPr="00C135AA">
<w:t>Contentieux sur la validit du brevet</w:t>
</w:r>
</w:p>
<w:p w:rsidR="00A13CB1" w:rsidRDefault="000F7DF9" w:rsidP="00AE46E9">
<w:pPr>
<w:pStyle w:val="Titre-niv2"/>
</w:pPr>
<w:r w:rsidRPr="00C135AA">
<w:t>Dlai de restauration</w:t>
</w:r>
</w:p>
<w:p w:rsidR="00A13CB1" w:rsidRDefault="00A13CB1" w:rsidP="00AE46E9">
<w:pPr>
<w:pStyle w:val="Paragraphenum-Titrenoy"/>
</w:pPr>
</w:p>
<w:p w:rsidR="00A13CB1" w:rsidRDefault="000F7DF9" w:rsidP="00AE46E9">
<w:pPr>
<w:pStyle w:val="Paragraphesimple"/>
<w:rPr>
<w:color w:val="000000"/>
<w:shd w:val="clear" w:color="auto" w:fill="FFFFFF"/>
</w:rPr>
</w:pPr>
<w:r w:rsidRPr="00C135AA">
<w:t>Selon l</w:t>
</w:r>
<w:r w:rsidR="00963C32">
<w:t>'</w:t>
</w:r>
<w:r w:rsidRPr="00C135AA">
<w:t>article L. 612-16 du Code de la propri intellectuelle, en cas d</w:t>
</w:r>
</w:p>
</root>
Expected output
<root>
<div1chr>
<tit>
<al>Contentieux sur la validit du brevet</al>
</tit>
<div2chr>
<tit>
<al>Dlai de restauration</al>
</tit>
<pnchr>
<observ>
<al>Selon l'article L. 612-16 du Code de la propri intellectuelle, en cas d</al>
</observ>
</pnchr>
<pnchr>
<observ>
<al>Selon l'article L. 612-16 du Code de la propri intellectuelle, en cas d</al>
</observ>
</pnchr>
</div2chr>
</div1chr>
</root>
You need something along the lines
<xsl:for-each-group select="w:p"
group-starting-with="w:pPr/w:pStyle[w:val='Titre-niv1']">
<div1chr>
<tit>
<xsl:value-of select="current-group()[1]/w:r/w:t"/>
</tit>
<xsl:for-each-group select="remove(current=group(), 1)"
group-starting-with="w:pPr/w:pStyle[w:val='Titre-niv2']">
<div2chr>
<tit>
<xsl:value-of select="current-group()[1]/w:r/w:t"/>
</tit>
<xsl:apply-templates select="remove(current-group(), 1)"/>
</div2chr>
</...
</...
</...

Dynamic side-by side tables in msword using xslt

I'm using xslt to generate a Word document using FoundationPHP. I'm trying to create a template that will dynamically create tables (max of 2 side by side tables per line) based on the number of items a user selects.
My prefered outcome would have the generated Word ducument appear like:
Table 1 Table 2
Table 3
I've tried placing the table in a text box and using a foreach command, but what I get is:
Table 1
Table 2
Table 3
I've also tried running the foreach command on the <w:tc> but get results like:
Table 1 Table 2 Table 3
My xslt code looks like:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<-- Code for document properties
<w:body>
<w:tbl>
<w:tblPr>
<w:tblStyle w:val="TableGrid"/>
<w:tblW w:w="2483" w:type="pct"/>
<w:tblBorders>
<w:top w:val="none" w:sz="0" w:space="0" w:color="auto"/>
<w:left w:val="none" w:sz="0" w:space="0" w:color="auto"/>
<w:bottom w:val="none" w:sz="0" w:space="0" w:color="auto"/>
<w:right w:val="none" w:sz="0" w:space="0" w:color="auto"/>
<w:insideH w:val="none" w:sz="0" w:space="0" w:color="auto"/>
<w:insideV w:val="none" w:sz="0" w:space="0" w:color="auto"/>
</w:tblBorders>
<w:tblLook w:val="04A0" w:firstRow="1" w:lastRow="0" w:firstColumn="1" w:lastColumn="0" w:noHBand="0" w:noVBand="1"/>
</w:tblPr>
<w:tblGrid>
<w:gridCol w:w="4648"/>
</w:tblGrid>
<w:tr w:rsidR="00A00BC9" w:rsidTr="00A00BC9">
<xsl:for-each select="root/row">
<w:tc>
<w:tcPr>
<w:tcW w:w="4625" w:type="dxa"/>
</w:tcPr>
<w:tbl>
<w:tblPr>
<w:tblStyle w:val="TableGrid"/>
<w:tblW w:w="4320" w:type="dxa"/>
<w:tblBorders>
<w:top w:val="none" w:sz="0" w:space="0" w:color="auto"/>
</w:tblBorders>
<w:tblLook w:val="04A0" w:firstRow="1" w:lastRow="0" w:firstColumn="1" w:lastColumn="0" w:noHBand="0" w:noVBand="1"/>
</w:tblPr>
<w:tblGrid>
<w:gridCol w:w="4363"/>
</w:tblGrid>
<w:tr w:rsidR="00A00BC9" w:rsidTr="00BD1383">
<w:trPr>
<w:trHeight w:val="3312"/>
</w:trPr>
<w:tc>
<w:tcPr>
<w:tcW w:w="4449" w:type="dxa"/>
<w:tcBorders>
<w:top w:val="single" w:sz="18" w:space="0" w:color="1E4959"/>
<w:left w:val="single" w:sz="18" w:space="0" w:color="1E4959"/>
<w:bottom w:val="single" w:sz="18" w:space="0" w:color="1E4959"/>
<w:right w:val="single" w:sz="18" w:space="0" w:color="1E4959"/>
</w:tcBorders>
<w:vAlign w:val="center"/>
</w:tcPr>
<w:p w:rsidR="00A00BC9" w:rsidRDefault="00A00BC9" w:rsidP="00A00BC9">
<w:pPr>
<w:spacing w:after="0" w:line="240" w:lineRule="auto"/>
<w:jc w:val="center"/>
</w:pPr>
<w:r>
<w:rPr>
<w:noProof/>
</w:rPr>
<w:drawing>
<!-- Code for image-->
</w:drawing>
</w:r>
</w:p>
</w:tc>
</w:tr>
<w:tr w:rsidR="00A00BC9" w:rsidTr="00BD1383">
<w:trPr>
<w:trHeight w:hRule="exact" w:val="144"/>
</w:trPr>
<w:tc>
<w:tcPr>
<w:tcW w:w="4449" w:type="dxa"/>
<w:tcBorders>
<w:top w:val="single" w:sz="18" w:space="0" w:color="1E4959"/>
<w:left w:val="nil"/>
<w:bottom w:val="nil"/>
<w:right w:val="nil"/>
</w:tcBorders>
<w:vAlign w:val="center"/>
</w:tcPr>
<w:p w:rsidR="00A00BC9" w:rsidRDefault="00A00BC9" w:rsidP="00A00BC9">
<w:pPr>
<w:spacing w:after="0" w:line="240" w:lineRule="auto"/>
<w:jc w:val="center"/>
</w:pPr>
</w:p>
</w:tc>
</w:tr>
<w:tr w:rsidR="00A00BC9" w:rsidTr="00BD1383">
<w:trPr>
<w:trHeight w:val="720"/>
</w:trPr>
<w:tc>
<w:tcPr>
<w:tcW w:w="4449" w:type="dxa"/>
<w:tcBorders>
<w:top w:val="nil"/>
<w:left w:val="nil"/>
<w:bottom w:val="nil"/>
<w:right w:val="nil"/>
</w:tcBorders>
</w:tcPr>
<w:p w:rsidR="00A00BC9" w:rsidRDefault="00A00BC9" w:rsidP="00A00BC9">
<w:pPr>
<w:spacing w:after="0" w:line="240" w:lineRule="auto"/>
<w:jc w:val="center"/>
<w:rPr>
<w:rFonts w:cstheme="minorHAnsi"/>
<w:sz w:val="20"/>
<w:szCs w:val="20"/>
</w:rPr>
</w:pPr>
<w:r>
<w:rPr>
<w:rFonts w:cstheme="minorHAnsi"/>
<w:sz w:val="20"/>
<w:szCs w:val="20"/>
</w:rPr>
<w:t>Improved Sale <xsl:value-of select="rank"/></w:t>
</w:r>
</w:p>
<w:p w:rsidR="00A00BC9" w:rsidRPr="005F3377" w:rsidRDefault="00A00BC9" w:rsidP="00A00BC9">
<w:pPr>
<w:spacing w:after="0" w:line="240" w:lineRule="auto"/>
<w:jc w:val="center"/>
<w:rPr>
<w:rFonts w:cstheme="minorHAnsi"/>
<w:sz w:val="20"/>
<w:szCs w:val="20"/>
</w:rPr>
</w:pPr>
<w:r>
<w:rPr>
<w:rFonts w:cstheme="minorHAnsi"/>
<w:sz w:val="20"/>
<w:szCs w:val="20"/>
</w:rPr>
<w:t xml:space="preserve"><xsl:value-of select="address"/>, <xsl:value-of select="city"/></w:t>
</w:r>
</w:p>
</w:tc>
</w:tr>
</w:tbl>
<w:p w:rsidR="00A00BC9" w:rsidRDefault="00A00BC9" w:rsidP="00A00BC9"/>
</w:tc>
</xsl:for-each>
<w:bookmarkStart w:id="0" w:name="_GoBack"/>
<w:bookmarkEnd w:id="0"/>
</w:tr>
</w:tbl>
<w:p w:rsidR="00A00BC9" w:rsidRDefault="00A00BC9"/>
<w:sectPr w:rsidR="00A00BC9">
<w:pgSz w:w="12240" w:h="15840"/>
<w:pgMar w:top="1440" w:right="1440" w:bottom="1440" w:left="1440" w:header="720" w:footer="720" w:gutter="0"/>
<w:cols w:space="720"/>
<w:docGrid w:linePitch="360"/>
</w:sectPr>
</w:body>
</w:document>
</xsl:template>
</xsl:stylesheet>
Any help would be greatly appreciated.
Might put you on the track to a solution, definitely too big for a comment...
Are you able to use Nested Tables?
The table would look something like this:
And the relevant .WordOpenXML for this structure would be:
<w:body>
<w:tbl>
<w:tblPr>
<w:tblStyle w:val="TableGrid"/>
<w:tblW w:w="0" w:type="auto"/>
<w:tblCellMar>
<w:top w:w="85" w:type="dxa"/>
<w:left w:w="85" w:type="dxa"/>
<w:bottom w:w="85" w:type="dxa"/>
<w:right w:w="85" w:type="dxa"/>
</w:tblCellMar>
<w:tblLook w:val="04A0" w:firstRow="1" w:lastRow="0" w:firstColumn="1" w:lastColumn="0" w:noHBand="0" w:noVBand="1"/>
</w:tblPr>
<w:tblGrid>
<w:gridCol w:w="4598"/>
<w:gridCol w:w="4598"/>
</w:tblGrid>
<w:tr w:rsidR="00FE4524" w:rsidTr="00CE49DD">
<w:tc>
<w:tcPr>
<w:tcW w:w="9196" w:type="dxa"/>
<w:gridSpan w:val="2"/>
</w:tcPr>
<w:p w:rsidR="00FE4524" w:rsidRDefault="00FE4524" w:rsidP="00CE49DD"/>
</w:tc>
</w:tr>
<w:tr w:rsidR="00FE4524" w:rsidTr="00CE49DD">
<w:tc>
<w:tcPr>
<w:tcW w:w="4598" w:type="dxa"/>
</w:tcPr>
<w:tbl>
<w:tblPr>
<w:tblStyle w:val="TableGrid"/>
<w:tblW w:w="0" w:type="auto"/>
<w:tblLook w:val="04A0" w:firstRow="1" w:lastRow="0" w:firstColumn="1" w:lastColumn="0" w:noHBand="0" w:noVBand="1"/>
</w:tblPr>
<w:tblGrid>
<w:gridCol w:w="4413"/>
</w:tblGrid>
<w:tr w:rsidR="00FE4524" w:rsidTr="00CE49DD">
<w:tc>
<w:tcPr>
<w:tcW w:w="4413" w:type="dxa"/>
</w:tcPr>
<w:p w:rsidR="00FE4524" w:rsidRDefault="00FE4524" w:rsidP="00CE49DD"/>
</w:tc>
</w:tr>
<w:tr w:rsidR="00FE4524" w:rsidTr="00CE49DD">
<w:tc>
<w:tcPr>
<w:tcW w:w="4413" w:type="dxa"/>
</w:tcPr>
<w:p w:rsidR="00FE4524" w:rsidRDefault="00FE4524" w:rsidP="00CE49DD"/>
</w:tc>
</w:tr>
</w:tbl>
<w:p w:rsidR="00FE4524" w:rsidRDefault="00FE4524" w:rsidP="00CE49DD"/>
</w:tc>
<w:tc>
<w:tcPr>
<w:tcW w:w="4598" w:type="dxa"/>
</w:tcPr>
<w:tbl>
<w:tblPr>
<w:tblStyle w:val="TableGrid"/>
<w:tblW w:w="0" w:type="auto"/>
<w:tblLook w:val="04A0" w:firstRow="1" w:lastRow="0" w:firstColumn="1" w:lastColumn="0" w:noHBand="0" w:noVBand="1"/>
</w:tblPr>
<w:tblGrid>
<w:gridCol w:w="2206"/>
<w:gridCol w:w="2207"/>
</w:tblGrid>
<w:tr w:rsidR="00FE4524" w:rsidTr="00CE49DD">
<w:tc>
<w:tcPr>
<w:tcW w:w="2206" w:type="dxa"/>
</w:tcPr>
<w:p w:rsidR="00FE4524" w:rsidRDefault="00FE4524" w:rsidP="00CE49DD"/>
</w:tc>
<w:tc>
<w:tcPr>
<w:tcW w:w="2207" w:type="dxa"/>
</w:tcPr>
<w:p w:rsidR="00FE4524" w:rsidRDefault="00FE4524" w:rsidP="00CE49DD"/>
</w:tc>
</w:tr>
<w:tr w:rsidR="00FE4524" w:rsidTr="00CE49DD">
<w:tc>
<w:tcPr>
<w:tcW w:w="2206" w:type="dxa"/>
</w:tcPr>
<w:p w:rsidR="00FE4524" w:rsidRDefault="00FE4524" w:rsidP="00CE49DD"/>
</w:tc>
<w:tc>
<w:tcPr>
<w:tcW w:w="2207" w:type="dxa"/>
</w:tcPr>
<w:p w:rsidR="00FE4524" w:rsidRDefault="00FE4524" w:rsidP="00CE49DD"/>
</w:tc>
</w:tr>
</w:tbl>
<w:p w:rsidR="00FE4524" w:rsidRDefault="00FE4524" w:rsidP="00CE49DD"/>
</w:tc>
</w:tr>
<w:tr w:rsidR="00FE4524" w:rsidTr="00CE49DD">
<w:tc>
<w:tcPr>
<w:tcW w:w="9196" w:type="dxa"/>
<w:gridSpan w:val="2"/>
</w:tcPr>
<w:p w:rsidR="00FE4524" w:rsidRDefault="00FE4524" w:rsidP="00CE49DD"/>
</w:tc>
</w:tr>
</w:tbl>
<w:p w:rsidR="00000000" w:rsidRDefault="00FE4524"/>
<w:sectPr w:rsidR="00000000">
<w:pgSz w:w="12240" w:h="15840"/>
<w:pgMar w:top="1440" w:right="1440" w:bottom="1440" w:left="1440" w:header="720" w:footer="720" w:gutter="0"/>
<w:cols w:space="720"/>
</w:sectPr>
</w:body>

Regular expression that can get tag with some text inside

Here is my example:
<w:p>
<w:pPr>
<w:spacing></w:spacing>
<w:contextualSpacing/>
<w:rPr/>
</w:pPr>
<w:r>
<w:rPr>
<w:color/>
<w:rtl w:val="0"/>
</w:rPr>
<w:t>Some text</w:t>
</w:r>
<w:r>
<w:rPr>
<w:color/>
<w:rtl/>
</w:rPr>
<w:t>My search text</w:t>
</w:r>
<w:r>
<w:rPr>
<w:color/>
<w:rtl/>
</w:rPr>
<w:t>Other text</w:t>
</w:r>
I need to get this block with a regular expression:
<w:r>
<w:rPr>
<w:color/>
<w:rtl/>
</w:rPr>
<w:t>My search text</w:t>
</w:r>
But my regular expression always get first <w:r> and last </w:r>. Lazy quantifiers don`t help.
So how I can get <w:r> </w:r> block only with "My search text" inside?
https://regex101.com/r/2Sh68k/2 Here is the example
here the steps to fix your example
<w:r>.+My search text.+<\/w:r>
adding a non captuiring group around the . of .+ have no effect
<w:r>(?:.)+My search text(?:.)+<\/w:r>
inserting a negative lookahead (?!) before . to prevent the next matching chracter to be the start of not wanted sequence <w:r> or </w:r>
<w:r>(?:(?!<w:r>|<\/w:r>).)+My search text(?:(?!<w:r>|<\/w:r>).)+<\/w:r>
updated link

Working with multiple files using XSLT

I have XML file doc.xml like below:
<w:document xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main">
<w:p w:rsidR="002576E5" w:rsidRDefault="006D0E45">
<w:pPr>
<w:pStyle w:val="figure"/>
</w:pPr>
<w:r><w:t xml:space="preserve">Figure 1 </w:t></w:r>
</w:p>
<w:p w:rsidR="002576E5" w:rsidRDefault="006D0E45">
<w:pPr>
<w:pStyle w:val="figure"/>
</w:pPr>
<w:r><w:t xml:space="preserve">Figure 2</w:t></w:r>
</w:p>
</w:document>
In the same location I have another file doc.xml.res
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Relationships xmlns="http://schemas.openxmlformats.org/package/2006/relationships">
<Relationship Id="rId8" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships /oleObject" Target="embeddings/oleObject1.bin"/>
</Relationship>
</Relationships>
If find each w:p[w:pPr/w:pStyle/#w:val="figure"] using XSLT would like to change the doc.xml.rels file as like below:
<Relationships xmlns="http://schemas.openxmlformats.org/package/2006/relationships">
<Relationship Id="rId8" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/oleObject" Target="embeddings/oleObject1.bin"/>
</Relationship>
<Relationship Id="rId3" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/oleObject" Target="c://1.jpg"/>
</Relationship>
<Relationship Id="rId4" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/oleObject" Target="c://2.jpg"/>
</Relationship>
</Relationships>
doc.xml should be like below. Would like to add pict element with imagedate r:id according to the Relationship id:
<w:p>
<w:r>
<w:pict>
<v:shape id="myShape2" type="#_x0000_t75" style="width:400; height:240">
<v:imagedata r:id="rId3"/>
</v:shape>
</w:pict>
</w:r>
</w:p>
<w:p w:rsidR="002576E5" w:rsidRDefault="006D0E45">
<w:pPr>
<w:pStyle w:val="figure"/>
</w:pPr>
<w:r><w:t xml:space="preserve">Figure 1 </w:t></w:r>
</w:p>
<w:p>
<w:r>
<w:pict>
<v:shape id="myShape2" type="#_x0000_t75" style="width:400; height:240">
<v:imagedata r:id="rId4"/>
</v:shape>
</w:pict>
</w:r>
</w:p>
<w:p w:rsidR="002576E5" w:rsidRDefault="006D0E45">
<w:pPr>
<w:pStyle w:val="figure"/>
</w:pPr>
<w:r><w:t xml:space="preserve">Figure 2</w:t></w:r>
</w:p>
Is this possible in XSLT?
Yes, this should be possible. result-document allows you to write other files. For reading them, you can use document(uri) function.

Accesing only immediate preceding sibling in xslt

I am using XSLT 1.0. Currently am in <w:t> template. I want to check if the preceding sibling w:r(id=3) has <w:fldChar w:fldCharType="end"/>.
I'm want the immediate preceding sibling only and not w:r having id=2 or id=1.
<t xmlns:w="http://example.com">
<w:r id="1">
<w:fldChar w:fldCharType="start"/>
</w:r>
<w:r id="2">
<w:fldChar w:fldCharType="separate"/>
</w:r>
<w:bookmarkStart w:id="0" w:name="tocStartRef_1"/>
<w:r id="3">
<w:fldChar w:fldCharType="end"/>
</w:r>
<w:bookmarkEnd w:id="0"/>
<w:r id="4">
<w:rPr>
<w:rStyle w:val="Span"/>
<w:rFonts w:ascii="arial" w:eastAsia="arial"
w:hAnsi="arial" w:cs="arial"/>
<w:b/>
<w:sz w:val="32"/>
</w:rPr>
<w:t>Fonts</w:t>
</w:r>
</t>
Use the xpath preceding-sibling axis like this:
preceding-sibling::w:r[1]/w:fldChar/#w:fldCharType = 'end'
which will select the nearest ([1]) preceding-sibling named w:r, then descend to any child element(s) named w:fldChar, then any attributes from there named w:fldCharType, then if any such node exists whose text is 'end', returns true.