|
Subject: Re: [xsl] automatic creation of nested elements From: "Ganesh Babu N" <nbabuganesh@xxxxxxxxx> Date: Thu, 4 Dec 2008 17:33:14 +0530 |
Dear All,
Input XML:
<map>
<source>bib-reference</source>
<source>@id</source>
<source>@class</source>
<target>reference/citation</target>
<target>@id</target>
<target>@type</target>
</map>
Required output:
<xsl:template match="bib-reference">
<xsl:element name="reference">
<xsl:element name="citation">
<xsl:attribute name="id">
<xsl:value-of select="@id"/>
</xsl:attribute>
<xsl:attribute name="type">
<xsl:value-of select="@class"/>
</xsl:attribute>
<xsl:apply-templates/>
</xsl:element>
<xsl:element>
</xsl:template>
Stylesheet used:
<xsl:template match="map">
<xsl:if test="count(child::*) > 3 and
not(starts-with(source,'@'))">
<mac:template match="{source[1]}">
<xsl:variable name="nestedele"
select="tokenize(target[1],'/')"/>
<xsl:call-template name="buildtree">
<xsl:with-param name="position"
select="1"/>
</xsl:call-template>
</mac:template>
</xsl:if>
</xsl:template>
<xsl:template name="buildtree">
<xsl:param name="position"/>
<xsl:variable name = "element"
select="tokenize(target[1],'/')[$position]"/>
<xsl:if test = "string($element)">
<mac:element name="{$element}">
<xsl:for-each select="target">
<xsl:if test="not($position = 1) and
exists(source[2])">
<mac:attribute
name="{substring-after(target[$position],'@')}">
<mac:value-of
select="{source[$position]}"/>
</mac:attribute>
</xsl:if>
</xsl:for-each>
<xsl:call-template name="buildtree">
<xsl:with-param name="position"
select="$position +1"/>
</xsl:call-template>
<mac:apply-templates/>
</mac:element>
</xsl:if>
</xsl:template>
Ouput with the above stylesheet:
<xsl:template match="bib-reference">
<xsl:element name="reference">
<xsl:element name="citation">
<xsl:attribute name="id">
<xsl:value-of select="@id"/>
</xsl:attribute>
<xsl:apply-templates/>
</xsl:element>
<xsl:apply-templates/>
<xsl:element>
</xsl:template>
In the resultant output I am getting template only for first attribute
and 2nd attribute is missing.
<xsl:apply-templates> is appearing twice resulting duplication of the
content. Please suggest how to get the required output.
Thanks & Regards,
Ganesh
On Thu, Dec 4, 2008 at 2:58 PM, vasu chakkera <vasucv@xxxxxxxxx> wrote:
>
> You have to be clear on your problem. Best way is to give example of your
> XML and xsl and your output and tell where in output you see the problem
> Most people in the list are very generous and take extra pains in trying to
> understand the problem and suggest a solution. All they are doing is trying
> to help you. So, from your side, its always a good practice to really put
> down the problem as clear as possible so that its easy for people to answer
> ( without guessing what your problem could be )
>
> Cheers.
> Vasu
>
> -------Original Message-------
>
> From: Ganesh Babu N
> Date: 04/12/2008 06:15:31
> To: xsl-list@xxxxxxxxxxxxxxxxxxxxxx
> Subject: Re: [xsl] automatic creation of nested elements
>
> Dear all,
>
> I am facing two problems in the given stylesheet.
>
> 1. <xsl:apply-templates/> is coming in both the elements resulting
> Duplication of the content.
> 2. Multiple attributes are not getting created. Only single
> Attributing is getting created.
>
> Please guide me how to achieve the above two points.
>
> Regards,
> Ganesh
>
>
> On Mon, Dec 1, 2008 at 8:22 PM, Vasu Chakkera <vasucv@xxxxxxxxx> wrote:
>> Try the below. ( I just carried it along the way of creating the
>> children recursively from your target. Add your attributes etc as
>> necessary ). Just changed from where you had a for-each. Dint check
>> the other parts of your code. The below produces the result you
>> wanted.
>>
>> <xsl:template match="map">
>> <xsl:if test="count(child::*) > 3 and not(starts-with(source,'@'))">
>> <mac:template match="{source[1]}">
>> <xsl:variable name="nestedele"
>> select="tokenize(target[1],'/')"/>
>> <xsl:call-template name="buildtree">
>> <xsl:with-param name="position" select="1"/>
>> </xsl:call-template>
>> </mac:template>
>> </xsl:if>
>> </xsl:template>
>> <xsl:template name="buildtree">
>> <xsl:param name="position"/>
>> <xsl:variable name = "element" select="tokenize(target[1],'/')[$position]
> />
>> <xsl:if test = "string($element)">
>> <mac:element name="{$element}">
>> <xsl:if test="not($position = 1) and exists(source[2])">
>> <mac:attribute name="{substring-after(target[$position],'@')}">
>> <mac:value-of select="{source[$position]}"/>
>> </mac:attribute>
>> </xsl:if>
>> <xsl:call-template name="buildtree">
>> <xsl:with-param name="position" select="$position +1"/>
>> </xsl:call-template>
>> <mac:apply-templates/>
>> </mac:element>
>> </xsl:if>
>> </xsl:template>
>>
>> hth
>> Vasu C
>>
>> 2008/12/1 Ganesh Babu N <nbabuganesh@xxxxxxxxx>:
>>> Input XML:
>>>
>>> <map>
>>> <source>bib-reference</source>
>>> <source>@id</source>
>>> <target>reference/citation</target>
>>> <target>@id</target>
>>> </map>
>>>
>>> Required output:
>>> <xsl:template match="bib-reference">
>>> <xsl:element name="reference">
>>> <xsl:element name="citation">
>>> <xsl:attribute name="id">
>>> <xsl:value-of select="@id"/>
>>> </xsl:attribute>
>>> <xsl:apply-templates/>
>>> </xsl:element>
>>> <xsl:element>
>>> </xsl:template>
>>>
>>> My XSLT:
>>> <xsl:template match="map">
>>> <xsl:when test="count(child::*) > 3 and not(starts-with(source,'@'))">
>
>>> <mac:template match="{source[1]}">
>>> <xsl:variable name="nestedele"
>>> select="tokenize(target[1],'/')"/>
>>> <xsl:for-each select="$nestedele">
>>> <xsl:variable name="tem" select="."/>
>>> <mac:element name="{$tem}">
>>> <xsl:for-each select="target">
>>> <xsl:variable name="pos" select="position()"/>
>>> <xsl:if test="not(position()=1) and exists(../source[2])">
>>> <mac:attribute name="{substring-after(.,'@')}">
>>> <mac:value-of select="{../source[$pos]}"/>
>>> </mac:attribute>
>>> </xsl:if>
>>> </xsl:for-each>
>>> <mac:apply-templates/>
>>> </mac:element>
>>> </xsl:for-each>
>>> </mac:template>
>>> </xsl:when>
>>> </xsl:template>
>>>
>>> This will create one element after the other but it won't create the
>>> nested one. In a result for bib-reference, two elements will be
>>> created with same content. Which is a wrong one. Please guide me how
>>> to generate the nested element structure.
>>>
>>> Regards,
>>> Ganesh
>>>
>>>
>>
>>
>>
>> --
>> Vasu Chakkera
>> Numerical Algorithms Group Ltd.
>> Oxford
>> www.vasucv.com
| Current Thread |
|---|
|
| <- Previous | Index | Next -> |
|---|---|---|
| Re: [xsl] automatic creation of nes, vasu chakkera | Thread | Re: [xsl] automatic creation of nes, vasu chakkera |
| Re: [xsl] removing nodes to parent , Vasu Chakkera | Date | Re: [xsl] removing nodes to parent , G. Ken Holman |
| Month |