I am an absolute novice at this; in fact, this is the first time I've worked with XML/XST Transforms at all. I'm very lost, and in dire need of assistance. Here's the problem:
We receive several XML files from a vendor on a daily basis. We've been using a
VB application to parse and import the data from these files into our SQL database, but now we are re-engineering everything into BizTalk, but the BizTalk process that's been built cannot read the source files because all the data is encoded as attributes in a "row" node, rather than as individual nodes themselves (which is what the BizTalk process requires).
Here's a sample of the source file:
<xml xmlns:s="uuid:BDC6E3F0-6DA3-11d1-A2A3-00AA00C14882" xmlns:dt="uuid:C2F41010-65B3-11d1-A29F-00AA00C14882" xmlns:rs="urn:schemas-microsoft-com:rowset" xmlns:z="#RowsetSchema">
- <s:Schema id="RowsetSchema">
- <s:ElementType name="row" content="eltOnly">
- <s:AttributeType name="NDC" rs:number="1" rs:nullable="true" rs:writeunknown="true">
<s:datatype dt:type="string" rs:dbtype="str" dt:maxLength="11" />
</s:AttributeType>
- <s:AttributeType name="PRICE_SOURCE" rs:number="2" rs:nullable="true" rs:writeunknown="true">
<s:datatype dt:type="string" rs:dbtype="str" dt:maxLength="6" />
</s:AttributeType>
- <s:AttributeType name="PRICE_TYPE" rs:number="3" rs:nullable="true" rs:writeunknown="true">
<s:datatype dt:type="string" rs:dbtype="str" dt:maxLength="10" />
</s:AttributeType>
- <s:AttributeType name="PRICE_EFF_DATE_1" rs:number="4" rs:nullable="true" rs:writeunknown="true">
<s:datatype dt:type="number" rs:dbtype="varnumeric" dt:maxLength="20" rs:scale="0" rs:precision="38" />
</s:AttributeType>
- <s:AttributeType name="PRICE_AMT_1" rs:number="5" rs:nullable="true" rs:writeunknown="true">
<s:datatype dt:type="number" rs:dbtype="varnumeric" dt:maxLength="20" rs:scale="0" rs:precision="38" />
</s:AttributeType>
- <s:AttributeType name="PRICE_EFF_DATE_2" rs:number="6" rs:nullable="true" rs:writeunknown="true">
<s:datatype dt:type="number" rs:dbtype="varnumeric" dt:maxLength="20" rs:scale="0" rs:precision="38" />
</s:AttributeType>
- <s:AttributeType name="PRICE_AMT_2" rs:number="7" rs:nullable="true" rs:writeunknown="true">
<s:datatype dt:type="number" rs:dbtype="varnumeric" dt:maxLength="20" rs:scale="0" rs:precision="38" />
</s:AttributeType>
- <s:AttributeType name="PRICE_EFF_DATE_3" rs:number="8" rs:nullable="true" rs:writeunknown="true">
<s:datatype dt:type="number" rs:dbtype="varnumeric" dt:maxLength="20" rs:scale="0" rs:precision="38" />
</s:AttributeType>
- <s:AttributeType name="PRICE_AMT_3" rs:number="9" rs:nullable="true" rs:writeunknown="true">
<s:datatype dt:type="number" rs:dbtype="varnumeric" dt:maxLength="20" rs:scale="0" rs:precision="38" />
</s:AttributeType>
- <s:AttributeType name="DATE_TIME_CREATED" rs:number="10" rs:nullable="true" rs:writeunknown="true">
<s:datatype dt:type="dateTime" rs:dbtype="timestamp" dt:maxLength="16" rs:scale="0" rs:precision="19" rs:fixedlength="true" />
</s:AttributeType>
- <s:AttributeType name="USER_ID" rs:number="11" rs:nullable="true" rs:writeunknown="true">
<s:datatype dt:type="string" rs:dbtype="str" dt:maxLength="10" />
</s:AttributeType>
- <s:AttributeType name="DATE_TIME_MODIFIED" rs:number="12" rs:nullable="true" rs:writeunknown="true">
<s:datatype dt:type="dateTime" rs:dbtype="timestamp" dt:maxLength="16" rs:scale="0" rs:precision="19" rs:fixedlength="true" />
</s:AttributeType>
- <s:AttributeType name="FORM_ID" rs:number="13" rs:nullable="true" rs:writeunknown="true">
<s:datatype dt:type="string" rs:dbtype="str" dt:maxLength="10" />
</s:AttributeType>
- <s:AttributeType name="PACKAGE_PRICE_1" rs:number="14" rs:nullable="true" rs:writeunknown="true">
<s:datatype dt:type="number" rs:dbtype="varnumeric" dt:maxLength="20" rs:scale="0" rs:precision="38" />
</s:AttributeType>
- <s:AttributeType name="PACKAGE_PRICE_2" rs:number="15" rs:nullable="true" rs:writeunknown="true">
<s:datatype dt:type="number" rs:dbtype="varnumeric" dt:maxLength="20" rs:scale="0" rs:precision="38" />
</s:AttributeType>
- <s:AttributeType name="PACKAGE_PRICE_3" rs:number="16" rs:nullable="true" rs:writeunknown="true">
<s:datatype dt:type="number" rs:dbtype="varnumeric" dt:maxLength="20" rs:scale="0" rs:precision="38" />
</s:AttributeType>
<s:extends type="rs:rowbase" />
</s:ElementType>
</s:Schema>
- <rs:data>
<z:row NDC="00009738601" PRICE_SOURCE="FDB" PRICE_TYPE="FFP" PRICE_EFF_DATE_1="20020122" PRICE_AMT_1=".0573" PRICE_EFF_DATE_2="20001207" PRICE_AMT_2=".074" PRICE_EFF_DATE_3="19971001" PRICE_AMT_3=".0399" DATE_TIME_CREATED="2003-11-25T07:40:41" USER_ID="PHIDBA" DATE_TIME_MODIFIED="2003-11-25T07:40:41" FORM_ID="BATCH" PACKAGE_PRICE_1="0" PACKAGE_PRICE_2="0" PACKAGE_PRICE_3="0" />
So, like anyone starting out with a new language, I searched the 'net for a way to do this and found this article (
http://www.itjungle.com/mgo/mgo101003-story01.html) that seemed to cover it, by employing the following XSLT:
<xsl:output indent="yes" />
<xsl:strip-space elements="*" />
<xsl:template match="*">
<xsl:copy>
<xsl:if test="@*">
<xsl:for-each select="@*">
<xsl:element name="{name()}">
<xsl:value-of select="." />
</xsl:element>
</xsl:for-each>
</xsl:if>
<xsl:apply-templates />
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
So I wrote a simple C# program (my first) to apply the transform to the data thusly:
string InputFileName = @"C:\RXA_XML\DP070625.xml";
string OutputFileName = @"C:\RXA_XML\MyTestFile.xml";
DataSet ds = new DataSet();
System.IO.FileStream myFileStream = new System.IO.FileStream
(OutputFileName, System.IO.FileMode.Create);
try
{
ds.ReadXml(InputFileName);
XmlDataDocument xmlDoc = new XmlDataDocument(ds);
XslTransform xslTran = new XslTransform();
xslTran.Load(@"C:\RXA_XML\transform.xsl");
XmlTextWriter writer = new XmlTextWriter(@"C:\RXA_XML\xslt_output.xml",System .Text.Encoding.UTF8);
xslTran.Transform(xmlDoc, null, writer);
writer.Close();
catch...(etc.)
It seemed to work just fine, except I am getting "xmlns=" namespace declarations in all the nodes, which again, BizTalk can't seem to cope with:
<xml>
- <data xmlns="urn:schemas-microsoft-com:rowset">
- <row xmlns="#RowsetSchema">
<NDC xmlns="">00009738601</NDC>
<PRICE_SOURCE xmlns="">FDB</PRICE_SOURCE>
<PRICE_TYPE xmlns="">FFP</PRICE_TYPE>
<PRICE_EFF_DATE_1 xmlns="">20020122</PRICE_EFF_DATE_1>
<PRICE_AMT_1 xmlns="">.0573</PRICE_AMT_1>
<PRICE_EFF_DATE_2 xmlns="">20001207</PRICE_EFF_DATE_2>
<PRICE_AMT_2 xmlns="">.074</PRICE_AMT_2>
<PRICE_EFF_DATE_3 xmlns="">19971001</PRICE_EFF_DATE_3>
<PRICE_AMT_3 xmlns="">.0399</PRICE_AMT_3>
<DATE_TIME_CREATED xmlns="">2003-11-25T07:40:41</DATE_TIME_CREATED>
<USER_ID xmlns="">PHIDBA</USER_ID>
<DATE_TIME_MODIFIED xmlns="">2003-11-25T07:40:41</DATE_TIME_MODIFIED>
<FORM_ID xmlns="">BATCH</FORM_ID>
<PACKAGE_PRICE_1 xmlns="">0</PACKAGE_PRICE_1>
<PACKAGE_PRICE_2 xmlns="">0</PACKAGE_PRICE_2>
<PACKAGE_PRICE_3 xmlns="">0</PACKAGE_PRICE_3>
</row>
Can anyone please tell me how to eliminate all the namespace declarations from the output file? I've tried using exclude-result-prefixes, and copy-namespaces="no" to no avail (in fact, the latter bombs, telling me it's not a recognized command).
Thanks in advance.
pete