Re: [xsl] Combining of nested children

Subject: Re: [xsl] Combining of nested children
From: Syd Bauman <Syd_Bauman@xxxxxxxxx>
Date: Thu, 6 Sep 2012 00:28:19 -0400
Not sure I understand the requirements completely, but given your
input, the following does produce the desired output.

---------
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform";
  xmlns:xs="http://www.w3.org/2001/XMLSchema"; exclude-result-prefixes="xs" version="2.0">

  <!-- standard easy-to-write identity template -->
  <xsl:template match="@*|node()">
    <xsl:copy>
      <xsl:apply-templates select="@*|node()"/>
    </xsl:copy>
  </xsl:template>

  <!-- process a heading that has an @id specially: -->
  <xsl:template match="Heading[@id]">
    <xsl:copy>
      <!-- first, process my attributes -->
      <xsl:apply-templates select="@*"/>
      <!-- then, copy over desired <ToRef> -->
      <xsl:apply-templates
        select="../../Item/Heading[ not(@id)  and  @entry = current()/@entry  and  @data eq current()/@data ]/ToRef"/>
      <!-- last, process my children -->
      <xsl:apply-templates select="node()"/>
    </xsl:copy>
  </xsl:template>

  <!-- ignore <Item>s that have <Heading>s from which we already took the <ToRef> -->
  <!-- (Note that this code does not check to see that we actually took or will -->
  <!-- take the <ToRef> ? rather it just tests if there is no id= attr, and figures -->
  <!-- that if there is not an id=, then the entry= and data= must have matched. -->
  <xsl:template match="Item[Heading[not(@id)]]"/>

</xsl:stylesheet>
---------


> I need to find <Items> in a <List> that have an identical <Heading>
> attributes except for the @id, and insert a <ToRefs> element from
> the <Item> without an @id into the <Item> that has the @id
> attribute. Sample input and output <Item>s are shown below.
> 
> I will need to do the same sort of insertion at the <SubDiv1>
> level, or at the two other possible nested levels of <SubDiv2> and
> <SubDiv3> [not shown].
> 
> I will try to figure out how to do those latter cases once I
> understand how to do the <Headings> case.
> 
> Any help appreciated,

> Input:
> 
> <List>
>   <Item>
>     <Heading id="A4" entry="subject" data="Abolition of Serfdom">
>       <SubDiv1 id="A4-1" catalog="1" scott-number="350" pofis-number="474" 
> data="1948. 100th Anniversary of Abolition">
>         <Article>
>           <Person>Bulletin of the Ministry of Posts</Person>
>           <Title>New issues [Title varies or absent]</Title>
>         </Article>
>       </SubDiv1>
>     </Heading>
>   </Item>
>   <Item>
>     <Heading entry="subject" data="Abolition of Serfdom">
>       <ToRef xref="See also" data="Slovakia - Peasant Revolt 1848" file="s" 
> block="A1272-21"/>
>     </Heading>
>   </Item>
> </List>

> Output:
> <List>
>   <Item>
>     <Heading id="A4" entry="subject" data="Abolition of Serfdom">
>       <ToRef xref="See also" data="Slovakia - Peasant Revolt 1848" file="s" 
> block="A1272-21"/>
>       <SubDiv1 id="A4-1" catalog="1" scott-number="350" pofis-number="474" 
> data="1948. 100th Anniversary of Abolition">
>         <Article>
>           <Person>Bulletin of the Ministry of Posts</Person>
>           <Title>New issues [Title varies or absent]</Title>
>         </Article>
>       </SubDiv1>
>     </Heading>
>   </Item> 

Current Thread