Tek-Tips is the largest IT community on the Internet today!

Members share and learn making Tek-Tips Forums the best source of peer-reviewed technical information on the Internet!

  • Congratulations gkittelson on being selected by the Tek-Tips community for having the most helpful posts in the forums last week. Way to Go!

Is it possible to speed this up 1

Status
Not open for further replies.

CassidyHunt

IS-IT--Management
Jan 7, 2004
688
US
I have an xmldocument that is fairly large and I want to transform it for html display. Here is a sample of the XML:

Code:
<?xml version="1.0"?>
<Dispatch xmlns:xsi="[URL unfurl="true"]http://www.w3.org/2001/XMLSchema-instance"[/URL] xsi:noNamespaceSchemaLocation="file:///c:/Inetpub/[URL unfurl="true"]wwwroot/dispatch.xsd">[/URL]
  <Operation>
    <SCHEDULE_ID>STD_WHAT IF</SCHEDULE_ID>
    <WORKORDER_TYPE>W</WORKORDER_TYPE>
    <WORKORDER_BASE_ID>S40920</WORKORDER_BASE_ID>
    <WORKORDER_LOT_ID>2</WORKORDER_LOT_ID>
    <WORKORDER_SPLIT_ID>0</WORKORDER_SPLIT_ID>
    <WORKORDER_SUB_ID>0</WORKORDER_SUB_ID>
    <SEQUENCE_NO>60</SEQUENCE_NO>
    <RESOURCE_ID>9C9</RESOURCE_ID>
    <UNIT_ASSIGNED>5</UNIT_ASSIGNED>
    <START_DATE>2005-12-09T07:00:00.0000000-08:00</START_DATE>
    <COULD_START_DATE>2005-12-09T07:00:00.0000000-08:00</COULD_START_DATE>
    <FINISH_DATE>2005-12-09T08:50:00.0000000-08:00</FINISH_DATE>
    <ISDETERMINANT>Y</ISDETERMINANT>
    <DIRECTION>F</DIRECTION>
    <DELAY_REASON>N</DELAY_REASON>
    <IS_CONCURRENT>N</IS_CONCURRENT>
    <ORG_RESOURCE_ID>9C9</ORG_RESOURCE_ID>
    <WORKORDER_USER_1>FAIRLEAD LABBY PLATE</WORKORDER_USER_1>
    <WORKORDER_USER_3>CORDERO</WORKORDER_USER_3>
    <WORKORDER_ENGINEERED_BY>WCC</WORKORDER_ENGINEERED_BY>
    <WORKORDER_SPEC>FAIRLEAD LABBY PLATE</WORKORDER_SPEC>
    <CUSTOMER_NAME>RIO TINTO SERVICES, INC.</CUSTOMER_NAME>
    <CONCURRENT>9C9</CONCURRENT>
  </Operation>
  <Operation>
    <SCHEDULE_ID>STD_WHAT IF</SCHEDULE_ID>
    <WORKORDER_TYPE>W</WORKORDER_TYPE>
    <WORKORDER_BASE_ID>S40920</WORKORDER_BASE_ID>
    <WORKORDER_LOT_ID>3</WORKORDER_LOT_ID>
    <WORKORDER_SPLIT_ID>0</WORKORDER_SPLIT_ID>
    <WORKORDER_SUB_ID>0</WORKORDER_SUB_ID>
    <SEQUENCE_NO>10</SEQUENCE_NO>
    <RESOURCE_ID>3MACH3</RESOURCE_ID>
    <UNIT_ASSIGNED>4</UNIT_ASSIGNED>
    <START_DATE>2005-12-14T12:20:00.0000000-08:00</START_DATE>
    <COULD_START_DATE>2005-12-14T07:30:00.0000000-08:00</COULD_START_DATE>
    <FINISH_DATE>2005-12-15T07:40:00.0000000-08:00</FINISH_DATE>
    <ISDETERMINANT>Y</ISDETERMINANT>
    <DIRECTION>F</DIRECTION>
    <DELAY_REASON>N</DELAY_REASON>
    <IS_CONCURRENT>N</IS_CONCURRENT>
    <GROUP_RESOURCE_ID>3SMACH</GROUP_RESOURCE_ID>
    <ORG_RESOURCE_ID>3MACH3</ORG_RESOURCE_ID>
    <MAIN_RESOURCE>3SV5</MAIN_RESOURCE>
    <ACT_SETUP_HRS>0</ACT_SETUP_HRS>
    <ACT_RUN_HRS>12.07</ACT_RUN_HRS>
    <CALC_START_QTY>1</CALC_START_QTY>
    <COMPLETED_QTY>1</COMPLETED_QTY>
    <OPERATION_SPEC>PRINT OFF A COPY OF THE PRINT
LOCATE THE MATERIAL IN THE MACHINE SHOP OR SHIPPING.

HOURS FOR THIS OPERATION PROVIDED BY RUSS SHEEHAN. IF YOU CANNOT MEET THESE POSTED HOURS PLEASE GET WITH YOU SUPER VISOR AND BILLY TO GET THEM ADJUSTED PRIOR TO STARTING THIS WORK CENTER. THIS WILL IN TURN ALLOW THE SYSTEM TO SCHEDULE MORE ACCURATELY AND ALLOW YOU TO CLOSE PROPER % COMPLETE.
MACHINE THE TUBING AS PER PRINT AND STAGE IT TO THE MECH SHOP</OPERATION_SPEC>
    <WORKORDER_USER_1>LHDL0154 MARION UPPER FAIRLEAD</WORKORDER_USER_1>
    <WORKORDER_USER_2>NA</WORKORDER_USER_2>
    <WORKORDER_USER_3>CORDERO</WORKORDER_USER_3>
    <WORKORDER_ENGINEERED_BY>WCC</WORKORDER_ENGINEERED_BY>
    <WORKORDER_SPEC>MARION 8200 UPPER FAIR LEAD PARTS</WORKORDER_SPEC>
    <CUSTOMER_NAME>RIO TINTO SERVICES, INC.</CUSTOMER_NAME>
    <CONCURRENT>3MACH3</CONCURRENT>
  </Operation>
  <Operation>
    <SCHEDULE_ID>STD_WHAT IF</SCHEDULE_ID>
    <WORKORDER_TYPE>W</WORKORDER_TYPE>
    <WORKORDER_BASE_ID>S40920</WORKORDER_BASE_ID>
    <WORKORDER_LOT_ID>3</WORKORDER_LOT_ID>
    <WORKORDER_SPLIT_ID>0</WORKORDER_SPLIT_ID>
    <WORKORDER_SUB_ID>1</WORKORDER_SUB_ID>
    <SEQUENCE_NO>10</SEQUENCE_NO>
    <RESOURCE_ID>9C9</RESOURCE_ID>
    <UNIT_ASSIGNED>0</UNIT_ASSIGNED>
    <START_DATE>2005-12-14T07:00:00.0000000-08:00</START_DATE>
    <COULD_START_DATE>2005-12-09T13:40:00.0000000-08:00</COULD_START_DATE>
    <FINISH_DATE>2005-12-14T07:20:00.0000000-08:00</FINISH_DATE>
    <ISDETERMINANT>Y</ISDETERMINANT>
    <DIRECTION>F</DIRECTION>
    <DELAY_REASON>M, </DELAY_REASON>
    <IS_CONCURRENT>N</IS_CONCURRENT>
    <ORG_RESOURCE_ID>9C9</ORG_RESOURCE_ID>
    <MAIN_RESOURCE>9C9</MAIN_RESOURCE>
    <ACT_SETUP_HRS>0</ACT_SETUP_HRS>
    <ACT_RUN_HRS>0</ACT_RUN_HRS>
    <CALC_START_QTY>1</CALC_START_QTY>
    <COMPLETED_QTY>0</COMPLETED_QTY>
    <OPERATION_SPEC>ORDER THIS MATERIAL </OPERATION_SPEC>
    <CUSTOMER_NAME>RIO TINTO SERVICES, INC.</CUSTOMER_NAME>
    <CONCURRENT>9C9</CONCURRENT>
  </Operation>

  <Requirement>
    <SCHEDULE_ID>TOMORROW</SCHEDULE_ID>
    <WORKORDER_TYPE>W</WORKORDER_TYPE>
    <WORKORDER_BASE_ID>S40620</WORKORDER_BASE_ID>
    <WORKORDER_LOT_ID>2</WORKORDER_LOT_ID>
    <WORKORDER_SPLIT_ID>0</WORKORDER_SPLIT_ID>
    <WORKORDER_SUB_ID>0</WORKORDER_SUB_ID>
    <SEQUENCE_NO>60</SEQUENCE_NO>
    <PIECE_NO>20</PIECE_NO>
    <PART_ID>W II70 .062 60#</PART_ID>
    <REQUIRED_DATE>2006-01-19T16:00:00.0000000-08:00</REQUIRED_DATE>
    <ISSUED_QTY>0</ISSUED_QTY>
    <DESCRIPTION>WIRE II70 1/16 60# DS</DESCRIPTION>
    <QTY_ON_HAND>92</QTY_ON_HAND>
    <PRIMARY_WHS_ID>G</PRIMARY_WHS_ID>
  </Requirement>
  <Requirement>
    <SCHEDULE_ID>TOMORROW</SCHEDULE_ID>
    <WORKORDER_TYPE>W</WORKORDER_TYPE>
    <WORKORDER_BASE_ID>S40620</WORKORDER_BASE_ID>
    <WORKORDER_LOT_ID>2</WORKORDER_LOT_ID>
    <WORKORDER_SPLIT_ID>0</WORKORDER_SPLIT_ID>
    <WORKORDER_SUB_ID>0</WORKORDER_SUB_ID>
    <SEQUENCE_NO>100</SEQUENCE_NO>
    <PIECE_NO>10</PIECE_NO>
    <REQUIRED_DATE>2006-01-26T20:50:00.0000000-08:00</REQUIRED_DATE>
    <ISSUED_QTY>0</ISSUED_QTY>
    <REQUIREMENT_SPEC>CUT AND BEVEL DOWELS </REQUIREMENT_SPEC>
  </Requirement>
  <Requirement>
    <SCHEDULE_ID>TOMORROW</SCHEDULE_ID>
    <WORKORDER_TYPE>W</WORKORDER_TYPE>
    <WORKORDER_BASE_ID>S41084</WORKORDER_BASE_ID>
    <WORKORDER_LOT_ID>1</WORKORDER_LOT_ID>
    <WORKORDER_SPLIT_ID>0</WORKORDER_SPLIT_ID>
    <WORKORDER_SUB_ID>0</WORKORDER_SUB_ID>
    <SEQUENCE_NO>50</SEQUENCE_NO>
    <PIECE_NO>10</PIECE_NO>
    <REQUIRED_DATE>2006-01-23T06:00:00.0000000-08:00</REQUIRED_DATE>
    <ISSUED_QTY>0</ISSUED_QTY>
    <REQUIREMENT_SPEC>CUT MATERIAL FOR SEAL FITS</REQUIREMENT_SPEC>
  </Requirement>

It keeps going but its pretty easy to get the idea. I have about 5000 items in it that when I process the whole thing using the xsl below it is very slow.

Code:
<xsl:stylesheet version="1.0" xmlns:xsl="[URL unfurl="true"]http://www.w3.org/1999/XSL/Transform">[/URL]
<xsl:output method="html"/>

<xsl:template match="/">
	<xsl:apply-templates />
</xsl:template>

<xsl:template match="//Dispatch/Operation">
	<xsl:value-of select="WORKORDER_BASE_ID"/>
	<ul>
	<xsl:apply-templates select="//Dispatch/Requirement">
		<xsl:with-param name="scheduleid" select="SCHEDULE_ID" />
		<xsl:with-param name="workordertype" select="WORKORDER_TYPE" />
		<xsl:with-param name="workorderbaseid" select="WORKORDER_BASE_ID" />
		<xsl:with-param name="workorderlotid" select="WORKORDER_LOT_ID" />
		<xsl:with-param name="workordersplitid" select="WORKORDER_SPLIT_ID" />
		<xsl:with-param name="workordersubid" select="WORKORDER_SUB_ID" />
		<xsl:with-param name="sequenceno" select="SEQUENCE_NO" />
	</xsl:apply-templates>
	</ul>
</xsl:template>

<xsl:template match="//Dispatch/Requirement">
    <xsl:param name="scheduleid" />
	<xsl:param name="workordertype" />
	<xsl:param name="workorderbaseid" />
	<xsl:param name="workorderlotid" />
	<xsl:param name="workordersplitid" />
	<xsl:param name="workordersubid" />
	<xsl:param name="sequenceno" />
    <xsl:if test="SCHEDULE_ID = $scheduleid">
		<xsl:if test="WORKORDER_TYPE = $workordertype">
			<xsl:if test="WORKORDER_BASE_ID = $workorderbaseid">
				<xsl:if test="WORKORDER_LOT_ID = $workorderlotid">
					<xsl:if test="WORKORDER_SPLIT_ID = $workordersplitid">
						<xsl:if test="WORKORDER_SUB_ID = $workordersubid">
							<xsl:if test="SEQUENCE_NO = $sequenceno">
								<li><xsl:value-of select="PART_ID"/>&#160;<xsl:value-of select="PIECE_NO"/></li>
							</xsl:if>
						</xsl:if>
					</xsl:if>
				</xsl:if>
			</xsl:if>		
		</xsl:if>
    </xsl:if>
</xsl:template>

</xsl:stylesheet>

I know that it is probably really slow because I am looping through each item and running several tests against it. I am not good enough with xpath to be know if you could select just requirements that fit the parameters without passing parameters and testing.

If anyone knows I would be greatly appreciative.

Cassidy
 
Cassidy,

You could replace your cascade of xsl:if with a set of templates. Each xsl:apply-templates selects a nodeset, so try to have the top level xsl:apply-templates choose the smallest nodeset of all the selection criteria, then apply another xsl:apply-templates with another selection criteria, etc. Each xsl:apply-templates will be testing/selecting from a smaller and smaller set of nodes. My guess is that it will run faster with a judicious choice of the top two selection criteria.

Make sense?

Tom Morrison
 
It makes sense. I will give it a try and let you know my results. I guess I was just trying to mimic a where clause with xpath. Thank you for your reply. I will let you know how it goes.

Thanks

Cassidy
 
Yep, you gotta do some of the optimization that the SQL engine would do for you on a where. Of course, the SQL engine will also have cardinality information that you might not have. :-(

Tom Morrison
 
I handled it just that way and I passed in my dataset instead of the xml file and it is instant with 5000+ records.

Thanks

Cassidy
 
Also quick tip:

Don't use double back-slash "//"

This will search the entire tree. If you know the full path then simply specify that. Saves a lot of processing time. eg:

"Dispatch/Operation"

Jon

"I don't regret this, but I both rue and lament it.
 
Status
Not open for further replies.

Part and Inventory Search

Sponsor

Back
Top