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