xsl-list
[Top] [All Lists]

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

2009-03-06 12:00:53
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, Václav, matches the content of the second <Subject><Heading>'s child, Kucera, Václav. 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/

--~------------------------------------------------------------------
XSL-List info and archive:  http://www.mulberrytech.com/xsl/xsl-list
To unsubscribe, go to: http://lists.mulberrytech.com/xsl-list/
or e-mail: <mailto:xsl-list-unsubscribe(_at_)lists(_dot_)mulberrytech(_dot_)com>
--~--

<Prev in Thread] Current Thread [Next in Thread>