Re: [xsl] Removal of similar but different elements from XML file

Subject: Re: [xsl] Removal of similar but different elements from XML file
From: Martin Honnen <Martin.Honnen@xxxxxx>
Date: Fri, 06 Mar 2009 18:00:21 +0100
Mark Wilson wrote:
In an XML file used to generate a cumulative index to a journal, I have a number of similar citations, one of which sometimes needs to be removed from the file.

As shown in the original example below, note that the content of the first <Subject>'s <SubDiv1> child, Kucera, Vaclav, matches the content of the second <Subject><Heading>'s child, Kucera, Vaclav. As shown in the output example, I want to remove this second <Subject>.

However, I only want to do this for certain <Headings> and need to specify in my XSLT style sheet, for instance, if within an <Item> the <Heading>Stamp Designers</Heading>'s <SubDiv1> child is identical to another another <Subject>'s <Heading> child, remove the latter. Thus, I cannot use a generalized version (I must be able to specify the first <Heading>, because not all of these constructs should be removed). I do not object to running the style sheet repeatedly to apply it to, for instance, <Heading>Stamp Engravers</Heading>. However, it would be great to be able to drive it with a list like:

<Removals>
   <Citation>Stamp Designers</Citations>
   <Citation>Stamp Engravers</Citations>
<Removals>

Any hints or help would be greatly appreciated.

Here is a stylesheet that tries to implement your rules as far as I have understood them:


<xsl:stylesheet
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform";
  xmlns:data="http://example.com/2009/data";
  exclude-result-prefixes="data"
  version="1.0">

<xsl:output method="xml"/>

  <data:data>
    <Removals>
       <Citation>Stamp Designers</Citation>
       <Citation>Stamp Engravers</Citation>
    </Removals>
  </data:data>

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

<xsl:template match="Subject[Heading = preceding-sibling::Subject[Heading = document('')/xsl:stylesheet/data:data/Removals/Citation]/SubDiv1]"/>

</xsl:stylesheet>

It is simply the identity transformation plus one template suppressing the copying of any Subject elements for which there is a preceding Subject element where the Heading is in the Removals list and where the preceding SubDiv1 is equal to the Heading.

--

	Martin Honnen
	http://JavaScript.FAQTs.com/

Current Thread