Re: [xsl] Using XPath to match two node levels with the same name

Subject: Re: [xsl] Using XPath to match two node levels with the same name
From: "Mark Peters" <flickrmeister@xxxxxxxxx>
Date: Mon, 7 Aug 2006 15:20:52 -0400
Hi Mukul,

You're amazing! You really know your XSL.

I tip my hat to you.

Thanks,
Mark


On 8/7/06, Mukul Gandhi <gandhi.mukul@xxxxxxxxx> wrote:
Please try this stylesheet:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform";

xmlns:redirect="http://xml.apache.org/xalan/redirect";

extension-element-prefixes="redirect">

<xsl:output method="xml" />

<xsl:template match="/">
 <xsl:apply-templates select="topic" />
 <xsl:apply-templates select="//topic[count(ancestor::topic) = 1]" />
</xsl:template>

<xsl:template match="topic">
 <xsl:variable name="filename" select="concat(@id,'.xml')"/>
 <redirect:write select="$filename">
   <topic>
     <xsl:copy-of select="@*" />
     <xsl:apply-templates mode="x"/>
   </topic>
 </redirect:write>
</xsl:template>

<xsl:template match="topic[count(ancestor::topic) = 1]">
 <xsl:variable name="filename" select="concat(@id,'.xml')"/>
 <redirect:write select="$filename">
   <xsl:copy-of select="." />
 </redirect:write>
</xsl:template>

<xsl:template match="*" mode="x">
 <xsl:if test="not(self::topic)">
   <xsl:copy>
     <xsl:copy-of select="@*" />
     <xsl:apply-templates mode="x" />
   </xsl:copy>
 </xsl:if>
</xsl:template>

</xsl:stylesheet>

Current Thread