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
Mike KoporcSubject: Prevent xquery from converting < and >
Author: Mike Koporc
Date: 05 Aug 2008 05:35 PM
I am using a string concat and I want to create the xml tags in the concat. So for example concat("<test>", $row1/test, "</test>"). When I run the XQuery it is converting it to &lt;test&gt;. There is a style sheet being applied to it after that doesn't recognize the escape characters. Any way to turn this off? Thanks!

Postnext
Minollo I.Subject: Prevent xquery from converting < and >
Author: Minollo I.
Date: 05 Aug 2008 08:57 PM
Why are you creating tags like strings? Maybe what you are trying to do is: <test>{$row1/test/text()}</test>

Postnext
Mike KoporcSubject: Prevent xquery from converting < and >
Author: Mike Koporc
Date: 05 Aug 2008 09:55 PM
The reason I decided to use concat instead of just using the tags normally is because I had to leave open tags in certain places.

This is what I had originally tried, but it is not considered valid. Using the same structure but using concat instead of the xml tags produces the correct output (except that it is converting to &lt; and &gt;). So I'm ok with a way to make the code below valid or turning off the xml conversion from < to &lt;.

<MA540>
{

for $row1 in doc('converter:CSV?file:///c:/Documents%20and%20Settings/mkoporc/Desktop/SS2008/810/MA540CSV.20080708')/table/row
let $x := SystemUtils:Count() ,
$last := SystemUtils:GetPrev() ,
$cur := SystemUtils:SetPrev($row1/column.0/text())
return
if($x = 1) then
<InvoiceLoop>
<Invoice002_Company> $row1/column.1/text()</Invoice002_Company>
<Invoice003_Vendor-ID> $row1/column.2/text()</Invoice003_Vendor-ID>
<Invoice004_EDINumber> $row1/column.3/text() </Invoice004_EDINumber>
<Invoice005_InvoiceNumber> $row1/column.4/text() </Invoice005_InvoiceNumber>
<Invoice006_Suffix> $row1/column.5/text() </Invoice006_Suffix>
<Invoice007_RecordType>, $row1/column.6/text() </Invoice007_RecordType>
<Invoice008_TaxCode> $row1/column.7/text() </Invoice008_TaxCode>
<Invoice011_PONumber> $row1/column.10/text() </Invoice011_PONumber>
<Invoice019_InvoiceDate> $row1/column.18/text() </Invoice019_InvoiceDate>
<Invoice023_InvoiceAmount> $row1/column.22/text() </Invoice023_InvoiceAmount>
<Invoice031_DueDate> $row1/column.30/text() </Invoice031_DueDate>
<Invoice038_Operator> $row1/column.37/text() </Invoice038_Operator>
else
if(compare($cur, "H") = 0 ) then
</InvoiceLoop>
<InvoiceLoop>
<Invoice002_Company> $row1/column.1/text() </Invoice002_Company>
<Invoice003_Vendor-ID> $row1/column.2/text() </Invoice003_Vendor-ID>
<Invoice004_EDINumber> $row1/column.3/text() </Invoice004_EDINumber>
<Invoice005_InvoiceNumber> $row1/column.4/text() </Invoice005_InvoiceNumber>
<Invoice006_Suffix> $row1/column.5/text() </Invoice006_Suffix>
<Invoice007_RecordType> $row1/column.6/text() </Invoice007_RecordType>
<Invoice008_TaxCode> $row1/column.7/text() </Invoice008_TaxCode>
<Invoice011_PONumber> $row1/column.10/text() </Invoice011_PONumber>
<Invoice019_InvoiceDate> $row1/column.18/text() </Invoice019_InvoiceDate>
<Invoice023_InvoiceAmount> $row1/column.22/text() </Invoice023_InvoiceAmount>
<Invoice031_DueDate> $row1/column.30/text() </Invoice031_DueDate>
<Invoice038_Operator> $row1/column.37/text() </Invoice038_Operator>
else
if(compare($cur, "M") = 0) then
<Invoice122_Misc-AOC-Code> $row1/column.121/text() </Invoice122_Misc-AOC-Code>
<Invoice123_Misc-AOC-Amount> $row1/column.122/text() </Invoice123_Misc-AOC-Amount>
else
if (compare($cur, "D") = 0) then
<InvoiceItemLoop>
<Invoice048_Sequence-Number> $row1/column.47/text() </Invoice048_Sequence-Number>
<Invoice061_Line-Number> $row1/column.60/text() </Invoice061_Line-Number>
<InvoiceDescription> $row1/column.61/text() </InvoiceDescription>
<Invoice063_VendorItemIdentifier> $row1/column.62/text() </Invoice063_VendorItemIdentifier>
<Invoice064_EnteredQuantity> $row1/column.63/text() </Invoice064_EnteredQuantity>
<Invoice065_EnteredUOM> $row1/column.64/text() </Invoice065_EnteredUOM>
<Invoice066_UnitCost> $row1/column.65/text() </Invoice066_UnitCost>
</InvoiceItemLoop>
else ()

</InvoiceLoop>

}
</MA540>

Postnext
Minollo I.Subject: Prevent xquery from converting < and >
Author: Minollo I.
Date: 05 Aug 2008 10:36 PM
You definitely want to re-arrange the XQuery to make it well formed using open/closed tags. Concat() is meant to work with strings, and it won't help you creating XML output.

I'm not positive I understand precisely what your XQuer is trying to do; but maybe this help?

<MA540>
{
for $row1 in doc('converter:CSV?file:///c:/Documents%20and%20Settings/mkoporc/Desktop/SS2008/810/MA540CSV.20080708')/table/row
let $x := SystemUtils:Count() ,
$last := SystemUtils:GetPrev() ,
$cur := SystemUtils:SetPrev($row1/column.0/text())
return
<InvoiceLoop> {
if($x = 1) then (
<Invoice002_Company>{$row1/column.1/text()}</Invoice002_Company>,
<Invoice003_Vendor-ID>{$row1/column.2/text()}</Invoice003_Vendor-ID>,
<Invoice004_EDINumber>{$row1/column.3/text()}</Invoice004_EDINumber>,
<Invoice005_InvoiceNumber>{$row1/column.4/text()}</Invoice005_InvoiceNumber>,
<Invoice006_Suffix>{$row1/column.5/text()}</Invoice006_Suffix>,
<Invoice007_RecordType>{$row1/column.6/text()}</Invoice007_RecordType>,
<Invoice008_TaxCode>{$row1/column.7/text()}</Invoice008_TaxCode>,
<Invoice011_PONumber>{$row1/column.10/text()}</Invoice011_PONumber>,
<Invoice019_InvoiceDate>{$row1/column.18/text()}</Invoice019_InvoiceDate>,
<Invoice023_InvoiceAmount>{$row1/column.22/text()}</Invoice023_InvoiceAmount>,
<Invoice031_DueDate>{$row1/column.30/text()}</Invoice031_DueDate>,
<Invoice038_Operator>{$row1/column.37/text()}</Invoice038_Operator>
)
else if(compare($cur, "H") = 0 ) then (
<Invoice002_Company>{$row1/column.1/text()}</Invoice002_Company>,
<Invoice003_Vendor-ID>{$row1/column.2/text()}</Invoice003_Vendor-ID>,
<Invoice004_EDINumber>{$row1/column.3/text()}</Invoice004_EDINumber>,
<Invoice005_InvoiceNumber>{$row1/column.4/text()}</Invoice005_InvoiceNumber>,
<Invoice006_Suffix>{$row1/column.5/text()}</Invoice006_Suffix>,
<Invoice007_RecordType>{$row1/column.6/text()}</Invoice007_RecordType>,
<Invoice008_TaxCode>{$row1/column.7/text()}</Invoice008_TaxCode>,
<Invoice011_PONumber>{$row1/column.10/text()}</Invoice011_PONumber>,
<Invoice019_InvoiceDate>{$row1/column.18/text()}</Invoice019_InvoiceDate>,
<Invoice023_InvoiceAmount>{$row1/column.22/text()}</Invoice023_InvoiceAmount>,
<Invoice031_DueDate>{$row1/column.30/text()}</Invoice031_DueDate>,
<Invoice038_Operator>{$row1/column.37/text()}</Invoice038_Operator>
)
else if(compare($cur, "M") = 0) then (
<Invoice122_Misc-AOC-Code>{$row1/column.121/text()}</Invoice122_Misc-AOC-Code>,
<Invoice123_Misc-AOC-Amount>{$row1/column.122/text()}</Invoice123_Misc-AOC-Amount>
)
else if (compare($cur, "D") = 0) then (
<Invoice048_Sequence-Number>{$row1/column.47/text()}</Invoice048_Sequence-Number>,
<Invoice061_Line-Number>{$row1/column.60/text()}</Invoice061_Line-Number>,
<InvoiceDescription>{$row1/column.61/text()}</InvoiceDescription>,
<Invoice063_VendorItemIdentifier>{$row1/column.62/text()}</Invoice063_VendorItemIdentifier>,
<Invoice064_EnteredQuantity>{$row1/column.63/text()}</Invoice064_EnteredQuantity>,
<Invoice065_EnteredUOM>{$row1/column.64/text()}</Invoice065_EnteredUOM>,
<Invoice066_UnitCost>{$row1/column.65/text()}</Invoice066_UnitCost>
)
else ()
} </InvoiceLoop>
}
</MA540>

Postnext
Mike KoporcSubject: Prevent xquery from converting < and >
Author: Mike Koporc
Date: 05 Aug 2008 11:31 PM
The problem is that </InvoiceLoop> doesn't necessarily end each row. It might not be closed until the 8th row. For example the input file could look like

H,h1,h2
M,h1,h2,m1
D,h1,h2,d1,d2
D,h1,h2,d1,d2
D,h1,h2,d1,d2
H,h1,h2
M,h1,h2,m1
D,h1,h2,d1,d2

The goal is to avoid all the repetition in the header data and only grab the pieces from each row that are unique and combine them.
So the output would need to look like

<MA540>
<InvoiceLoop>
<H1></H1>
<H2></H2>
<M1></M1>
<InvoiceLineItemLoop>
<D1></D1>
<D2></D2>
</InvoiceLineItemLoop>
<InvoiceLineItemLoop>
<D1></D1>
<D2></D2>
</InvoiceLineItemLoop>
<InvoiceLineItemLoop>
<D1></D1>
<D2></D2>
</InvoiceLineItemLoop>
</InvoiceLoop>
<InvoiceLoop>
<H1></H1>
<H2></H2>
<M1></M1>
<InvoiceLineItemLoop>
<D1></D1>
<D2></D2>
</InvoiceLineItemLoop>
</InvoiceLoop>
</MA540>

Hopefully that help explains what I'm aiming for. Thank you for your help so far.

Postnext
Minollo I.Subject: Prevent xquery from converting < and >
Author: Minollo I.
Date: 06 Aug 2008 09:06 AM
Looks like you are trying to get some positional grouping. Let's try this then (I have assumed an "M" record immediately follows the corresponding "H" record, if present):

declare function local:getRelatedDs($item) {
let $nextItem := $item/following-sibling::*[column.0="H"][1]
for $related in $item/following-sibling::*[column.0="D"]
where if($nextItem) then $related << $nextItem else true()
return $related
};

<MA540> {
for $H in doc('converter:CSV?file:///c:/Documents%20and%20Settings/mkoporc/Desktop/SS2008/810/MA540CSV.20080708')/table/row
(: for $H in doc('c:/test.xml')/table/row :)
where $H/column.0 = "H"
return
<InvoiceLoop>
<Invoice002_Company>{$H/column.1/text()}</Invoice002_Company>
<Invoice003_Vendor-ID>{$H/column.2/text()}</Invoice003_Vendor-ID>
<Invoice004_EDINumber>{$H/column.3/text()}</Invoice004_EDINumber>
<Invoice005_InvoiceNumber>{$H/column.4/text()}</Invoice005_InvoiceNumber>
<Invoice006_Suffix>{$H/column.5/text()}</Invoice006_Suffix>
<Invoice007_RecordType>{$H/column.6/text()}</Invoice007_RecordType>
<Invoice008_TaxCode>{$H/column.7/text()}</Invoice008_TaxCode>
<Invoice011_PONumber>{$H/column.10/text()}</Invoice011_PONumber>
<Invoice019_InvoiceDate>{$H/column.18/text()}</Invoice019_InvoiceDate>
<Invoice023_InvoiceAmount>{$H/column.22/text()}</Invoice023_InvoiceAmount>
<Invoice031_DueDate>{$H/column.30/text()}</Invoice031_DueDate>
<Invoice038_Operator>{$H/column.37/text()}</Invoice038_Operator>
{
let $M := $H/following-sibling::*[1][column.0="M"]
return (
<Invoice122_Misc-AOC-Code>{$M/column.121/text()}</Invoice122_Misc-AOC-Code>,
<Invoice123_Misc-AOC-Amount>{$M/column.122/text()}</Invoice123_Misc-AOC-Amount>
)
}
{
for $D in local:getRelatedDs($H)
return
<InvoiceLineItemLoop>
<Invoice048_Sequence-Number>{$D/column.47/text()}</Invoice048_Sequence-Number>
<Invoice061_Line-Number>{$D/column.60/text()}</Invoice061_Line-Number>
<InvoiceDescription>{$D/column.61/text()}</InvoiceDescription>
<Invoice063_VendorItemIdentifier>{$D/column.62/text()}</Invoice063_VendorItemIdentifier>
<Invoice064_EnteredQuantity>{$D/column.63/text()}</Invoice064_EnteredQuantity>
<Invoice065_EnteredUOM>{$D/column.64/text()}</Invoice065_EnteredUOM>
<Invoice066_UnitCost>{$D/column.65/text()}</Invoice066_UnitCost>
</InvoiceLineItemLoop>
}
</InvoiceLoop>
} </MA540>

Postnext
Mike KoporcSubject: Prevent xquery from converting < and >
Author: Mike Koporc
Date: 06 Aug 2008 09:37 AM
That does it. Is there any documentation or tutorials on using siblings? Thanks!

Posttop
Minollo I.Subject: Prevent xquery from converting < and >
Author: Minollo I.
Date: 06 Aug 2008 09:46 AM
You can find details in the XPath specifications (http://www.w3.org/TR/xpath20/#axes).

We don't provide specific tutorials about them; being standard components of XPath, you will find many discussions on the Web or in books discussing XPath or XQuery.

 
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.