|
[XSL-LIST Mailing List Archive Home] [By Thread] [By Date] [Recent Entries] [Reply To This Message] Re: Adding elements to unknown tree structure
Ok, ok... Included please find two documents:
- add.xsl - data.xml add.xsl calls a template (tokenize) that is not included since, I believe, it is copyrighted by either Jeni Tennison or Sal Mangano and I've asked neither of them for permission to "publish" it here (but here's a link to a template that is strikingly similar to the one I'm using: http://www.exslt.org/str/functions/tokenize/ str.tokenize.template.xsl.html that might just do the same exact thing) use the following command to see the results (the addition of elements as specified by the parameters): xsltproc --stringparam path2page 'root/mydocuments/pictures/holiday' --stringparam pagename 'mypic.jpg' add.xsl data.xml The nice thing is that the stylesheet is smart enough to insert the elements as indicated by path2page without overwriting existing content and appends all necessary subfolder. I'd love to hear of any successes or failures using this stylesheet. Thanks again to all those that helped. Ted Stresen-Reuter http://www.tedmasterweb.com DATA.XML <?xml version="1.0" encoding="utf-8"?>
<root>
<folder name="mydocuments">
<folder name="pictures">
<folder name="family">
<folder name="weddings">
<page name="mine.jpg" />
<page name="sister.jpg" />
</folder>
</folder>
<folder name="friends">
<folder name="fiestas">
<page name="bachelorette_party.jpg" />
</folder>
</folder>
</folder>
</folder>
</root>ADD.XSL <?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:exsl="http://exslt.org/common" extension-element-prefixes="exsl"> <xsl:output method="xml" omit-xml-declaration="no" version="1.0" encoding="utf-8" indent="yes" /> <xsl:strip-space elements="*" /> <xsl:param name="pagename" />
<xsl:param name="path2page" /><xsl:variable name="path2pageAsNodes-RTF"> <xsl:call-template name="tokenize"> <xsl:with-param name="string" select="$path2page"/> <xsl:with-param name="delimiters" select="'/'"/> </xsl:call-template> </xsl:variable> <xsl:variable name="path2pageAsNodes" select="exsl:node-set($path2pageAsNodes-RTF)" /> <xsl:variable name="path2pageAsSource-RTF"> <xsl:call-template name="createChildRecursive"> <xsl:with-param name="folder_name" select="$path2pageAsNodes/token[position() = 1]"/> <xsl:with-param name="child_name" select="$path2pageAsNodes/token[position() = 2]"/> </xsl:call-template> </xsl:variable> <xsl:variable name="path2pageAsSource" select="exsl:node-set($path2pageAsSource-RTF)" /> <xsl:template name="insert_page"> <xsl:element name="page"> <xsl:attribute name="name"><xsl:value-of select="$pagename" /></xsl:attribute> </xsl:element> </xsl:template> <xsl:template name="createChildRecursive"> <xsl:param name="folder_name" /> <xsl:param name="child_name" /> <xsl:variable name="grandchild" select="$path2pageAsNodes/token[preceding-sibling::* = $child_name]" /> <xsl:element name="folder"> <xsl:attribute name="name"><xsl:value-of select="$folder_name" /></xsl:attribute> <xsl:choose> <xsl:when test="$child_name != ''"> <xsl:call-template name="createChildRecursive"> <xsl:with-param name="folder_name" select="$child_name" /> <xsl:with-param name="child_name" select="$grandchild" /> </xsl:call-template> </xsl:when> <xsl:otherwise> <xsl:call-template name="insert_page" /> </xsl:otherwise> </xsl:choose> </xsl:element> </xsl:template> <xsl:template name="path2root">
<xsl:param name="nodes" />
<xsl:for-each select="$nodes/ancestor-or-self::folder">
<xsl:value-of select="@name" />
<xsl:if test="position() != last()">
<xsl:text>/</xsl:text>
</xsl:if>
</xsl:for-each>
</xsl:template><!-- NOTES - Paths that are the same, path/to/my/doc and path/to/my/docs, may mistakenly be matched --> <xsl:template match="folder"> <xsl:variable name="depth" select="count(ancestor-or-self::*) - 1" /> <xsl:variable name="elem" select="@name" /> <xsl:variable name="sister" select="$path2pageAsNodes/token[position() = $depth]" /> <xsl:variable name="target_elem_child" select="$path2pageAsNodes/token[position() = ( $depth + 1 ) ]" /> <xsl:variable name="target_elem_grandchild" select="$path2pageAsNodes/token[position() = ( $depth + 2 ) ]" /> <xsl:variable name="this_elem_child" select="child::folder[@name = $target_elem_child]/@name" /> <xsl:variable name="child_is_a_match" select="count(descendant-or-self::folder[@name = $target_elem_child])" /> <xsl:variable name="path2root"> <xsl:call-template name="path2root"> <xsl:with-param name="nodes" select="." /> </xsl:call-template> </xsl:variable> <xsl:variable name="ancestor_path"> <xsl:for-each select="ancestor::folder"> <xsl:value-of select="@name" /> <xsl:if test="position() != last()"> <xsl:text disable-output-escaping="yes">/</xsl:text> </xsl:if> </xsl:for-each> </xsl:variable> <xsl:choose> <xsl:when test="$elem = $sister"> <xsl:copy> <xsl:copy-of select="@*" /> <xsl:choose> <xsl:when test="$target_elem_child != ''"> <xsl:if test="$child_is_a_match = 0"> <xsl:variable name="is_substring" select="starts-with($path2page, $ancestor_path)" /> <xsl:if test="$is_substring"> <xsl:call-template name="createChildRecursive"> <xsl:with-param name="folder_name" select="$target_elem_child" /> <xsl:with-param name="child_name" select="$target_elem_grandchild" /> </xsl:call-template> </xsl:if> </xsl:if> </xsl:when> <xsl:otherwise> <xsl:if test="$path2root = $path2page"> <xsl:call-template name="insert_page" /> </xsl:if> </xsl:otherwise> </xsl:choose> <xsl:apply-templates /> </xsl:copy> </xsl:when> <xsl:otherwise> <xsl:if test="$depth = 1"> <xsl:call-template name="createChildRecursive"> <xsl:with-param name="folder_name" select="$sister" /> <xsl:with-param name="child_name" select="$target_elem_child" /> </xsl:call-template> </xsl:if> <xsl:copy> <xsl:copy-of select="@*" /> <xsl:apply-templates /> </xsl:copy> </xsl:otherwise> </xsl:choose> </xsl:template> <xsl:template match="/| node() | @* | comment() | processing-instruction()"> <xsl:copy>
<xsl:apply-templates select="@* | node()"/>
</xsl:copy></xsl:template> </xsl:stylesheet> On Sep 27, 2005, at 11:17 PM, JBryant@xxxxxxxxx wrote: Suppose some poor soul five years from now has the same or a similar
|
PURCHASE STYLUS STUDIO ONLINE TODAY!Purchasing Stylus Studio from our online shop is Easy, Secure and Value Priced! Download The World's Best XML IDE!Accelerate XML development with our award-winning XML IDE - Download a free trial today! Subscribe in XML format
|

Cart








