Using XSL to delete fixed text in arbitrary elements

F

Fred Bartlett

Given this:
<a>..<b>..<b/><c>..</c>Stuff<d>..</d>..</a>
and this:
<a>..<b>..<b/>Stuff<d>..</d>..</a>
How can I delete 'Stuff' from both? 'Stuff' always appears in the
content of <a> and before the tag <d>, but there's no way to tell
which of several (approx 6, not just two) alternatives appears before
'Stuff'.

Thanks,
Fred
 
D

Dimitre Novatchev [MVP XML]

Fred Bartlett said:
Given this:
<a>..<b>..<b/><c>..</c>Stuff<d>..</d>..</a>
and this:
<a>..<b>..<b/>Stuff<d>..</d>..</a>
How can I delete 'Stuff' from both? 'Stuff' always appears in the
content of <a> and before the tag <d>, but there's no way to tell
which of several (approx 6, not just two) alternatives appears before
'Stuff'.

Thanks,
Fred

Both of the above are not well-formed xml documents.

Probably you meant:

<a>..<b>..</b><c>..</c>Stuff<d>..</d>..</a>

instead of
<a>..<b>..<b/><c>..</c>Stuff<d>..</d>..</a>

and


<a>..<b>..</b>Stuff<d>..</d>..</a>

instead of
<a>..<b>..<b/>Stuff<d>..</d>..</a>

The wanted transformation is a simple override of the identity rule:

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

<xsl:eek:utput omit-xml-declaration="yes"/>

<xsl:template match="@* | node()">
<xsl:copy>
<xsl:apply-templates select="@* | node()"/>
</xsl:copy>
</xsl:template>

<xsl:template match="text()[.='Stuff'][following-sibling::*[self::d]]"/>

</xsl:stylesheet>

In the transformation above an empty rule is added (,which effectively
ignores or discards or "deletes" all matching nodes from the generated
output) matching a text node, whose value is the string 'Stuff' and whose
immediate following sibling is a "d" element.

The results for both xml source documents (corrected to be wellformed) are
respectively:

<a>..<b>..</b><c>..</c><d>..</d>..</a>

and

<a>..<b>..</b><d>..</d>..</a>




Hope this helped.

Cheers,

Dimitre Novatchev [XML MVP],
FXSL developer, XML Insider,

http://fxsl.sourceforge.net/ -- the home of FXSL
Resume: http://fxsl.sf.net/DNovatchev/Resume/Res.html
 

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

No members online now.

Forum statistics

Threads
473,995
Messages
2,570,236
Members
46,821
Latest member
AleidaSchi

Latest Threads

Top