XML Editor
Sign up for a WebBoard account Sign Up Keyword Search Search More Options... Options
Chat Rooms Chat Help Help News News Log in to WebBoard Log in Not Logged in
Show tree view Topic
Go to previous topicPrev TopicGo to next topicNext Topic
Postnext
Ethan SteinSubject: Replace Node with Set of Nodes
Author: Ethan Stein
Date: 10 Jun 2009 04:21 AM
I am using Stylus Studio 2007 R2, and I am trying to replace a node with four different nodes. Currenly, I can replace the text of the node with four different nodes, but don't know how to replace the node itself.

Please help. My current xQuery is below.

Thanks.


----------------------
xQuery:


declare option ddtek:xml-streaming 'yes';
declare option ddtek:serialize "indent=yes, omit-xml-declaration=no";

declare variable $xPRSXMLInput as document-node(element(*, xs:untyped)) external;

declare function local:transformPlanName($planName as xs:string)
{
let $planName := fn:replace($planName, "AARP", "AARP®")
let $planName := fn:replace($planName, "MedicareComplete Essential", "MedicareComplete Essential®")
let $planName := fn:replace($planName, "Evercare", "Evercare®")
let $planName := fn:replace($planName, "MedicareComplete Choice", "MedicareComplete Choice®")
let $planName := fn:replace($planName, "Erickson Advantage", "Erickson Advantage®")
let $planName := fn:replace($planName, "SecureHorizons ", "SecureHorizons ®")
let $planName := fn:replace($planName, "MedicareComplete Plus", "MedicareComplete Plus™")
let $planName := fn:replace($planName, "MedicareComplete Value", "MedicareComplete Value™")
let $planName := fn:replace($planName, "MedicareComplete Premier", "MedicareComplete Premier™")
let $planName := fn:replace($planName, "MedicareComplete Balance", "MedicareComplete Balance™")
let $planName := fn:replace($planName, "MedicareComplete Mosaic", "MedicareComplete Mosaic™")
let $planName := fn:replace($planName, "MedicareDirect", "MedicareDirectࡈ")
return
if(fn:contains($planName, "MedicareComplete") and not(fn:contains($planName, "Essential")) and not(fn:contains($planName, "Choice")) and not(fn:contains($planName, "Plus")) and not(fn:contains($planName, "Value")) and not(fn:contains($planName, "Premier")) and not(fn:contains($planName, "Balance")) and not(fn:contains($planName, "Mosaic"))) then fn:replace($planName, "MedicareComplete", "MedicareComplete®")
else $planName
};

declare function local:replacePlanName($planNameNode as element(*, xs:untyped))
{

let $nodeName := name($planNameNode)
let $coverNode := concat($nodeName, "Cover")
let $tableHeaderNode := concat($nodeName, "TableHeader")
let $bodyTextNode := concat($nodeName, "BodyText")
let $planName := $planNameNode/text()
let $planName := fn:replace($planName, "AARP", "AARP®")
let $planName := fn:replace($planName, "MedicareComplete Essential", "MedicareComplete Essential®")
let $planName := fn:replace($planName, "Evercare", "Evercare®")
let $planName := fn:replace($planName, "MedicareComplete Choice", "MedicareComplete Choice®")
let $planName := fn:replace($planName, "Erickson Advantage", "Erickson Advantage®")
let $planName := fn:replace($planName, "SecureHorizons ", "SecureHorizons ®")
let $planName := fn:replace($planName, "MedicareComplete Plus", "MedicareComplete Plus™")
let $planName := fn:replace($planName, "MedicareComplete Value", "MedicareComplete Value™")
let $planName := fn:replace($planName, "MedicareComplete Premier", "MedicareComplete Premier™")
let $planName := fn:replace($planName, "MedicareComplete Balance", "MedicareComplete Balance™")
let $planName := fn:replace($planName, "MedicareComplete Mosaic", "MedicareComplete Mosaic™")
let $planName := fn:replace($planName, "MedicareDirect", "MedicareDirectࡈ")
return
if(fn:contains($planName, "MedicareComplete") and not(fn:contains($planName, "Essential")) and not(fn:contains($planName, "Choice")) and not(fn:contains($planName, "Plus")) and not(fn:contains($planName, "Value")) and not(fn:contains($planName, "Premier")) and not(fn:contains($planName, "Balance")) and not(fn:contains($planName, "Mosaic"))) then
let $planName := fn:replace($planName, "MedicareComplete", "MedicareComplete®")

return (
element { $nodeName } { $planNameNode/text() },
element { $coverNode } { concat("<p><span style="color:#000000;FONT-SIZE: 12pt;font-family:Times;">",$planName, "</p>") },
element { $tableHeaderNode } { concat("<p><span style="color:#000000;FONT-SIZE: 12pt;font-family:Times;">",$planName, "</p>") },
element { $bodyTextNode } { concat("<p><span style="color:#000000;FONT-SIZE: 12pt;font-family:Times;">",$planName, "</p>") }
)
else (
element { $nodeName } { $planNameNode/text() },
element { $coverNode } { concat("<p><span style="color:#000000;FONT-SIZE: 12pt;font-family:Times;">",$planName, "</p>") },
element { $tableHeaderNode } { concat("<p><span style="color:#000000;FONT-SIZE: 12pt;font-family:Times;">",$planName, "</p>") },
element { $bodyTextNode } { concat("<p><span style="color:#000000;FONT-SIZE: 12pt;font-family:Times;">",$planName, "</p>") }
)
};

declare function local:rename($n as element(*, xs:untyped))
{
element { name($n) } {$n/@*,
if(starts-with(upper-case(local-name($n)), "PLANNAME")) then local:replacePlanName($n)
else
($n/text(),
for $child in $n/*
return local:rename($child))}
};

<ExtractData>
{
for $CurrentYearPlan in $xPRSXMLInput/DataFile/ExtractData/CurrentYearPlan/CurrentYearPlanData
return
local:rename($CurrentYearPlan)
}
</ExtractData>

Posttop
Ethan SteinSubject: Replace Node with Set of Nodes
Author: Ethan Stein
Date: 10 Jun 2009 03:52 PM
Resolution was to add an if statement check prior to actually moving onto the next node. Solution is as follows:

declare function local:rename($n as element(*, xs:untyped))
{
if (starts-with(upper-case(local-name($n)), "PLANNAME") and (not(ends-with(local-name($n),"Cover"))) and (not(ends-with(local-name($n),"TableHeader"))) and (not(ends-with(local-name($n),"BodyText")))) then local:replacePlanName($n)
else (
element { name($n) } {$n/@*,
($n/text(),
for $child in $n/*
return local:rename($child))}
)
};

 
Go to previous topicPrev TopicGo to next topicNext Topic
Download A Free Trial of Stylus Studio 6 XML Professional Edition Today! Powered by Stylus Studio, the world's leading XML IDE for XML, XSLT, XQuery, XML Schema, DTD, XPath, WSDL, XHTML, SQL/XML, and XML Mapping!  
go

Log In Options

Site Map | Privacy Policy | Terms of Use | Trademarks
Stylus Scoop XML Newsletter:
W3C Member
Stylus Studio® and DataDirect XQuery ™are from DataDirect Technologies, is a registered trademark of Progress Software Corporation, in the U.S. and other countries. © 2004-2016 All Rights Reserved.