Subject: Re: 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>
|