954,517 Members — Technology Publication meets Social Media
Username:
Password:
Lost login information?
Have something to say? Contribute New Article Reply to this Article

Error when extracting data with XSLT out of a XML file

Hey guys,

I have a problem extracting some data out of this XML file:

<?xml version="1.0" encoding="UTF-8"?>
<ph:Graphs xmlns:ph="http://www.merge.something.com" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
	<ph:Graph name="mass_spring_mo">
		<ph:Element id="0" type="Fixed">
			<ph:Port id="1" type="port">
				<ph:Attribute>
					<ph:AttributeField name="type" value="string"/>
					<ph:AttributeField name="name" value="type"/>
					<ph:AttributeField name="value" value="flange"/>
				</ph:Attribute>
			</ph:Port>
		</ph:Element>
		<ph:Element id="2" type="Spring">
			<ph:Attribute>
				<ph:AttributeField name="type" value="int"/>
				<ph:AttributeField name="name" value="s_rel0"/>
				<ph:AttributeField name="value" value="5"/>
			</ph:Attribute>
			<ph:Attribute>
				<ph:AttributeField name="type" value="int"/>
				<ph:AttributeField name="name" value="par_s_rel0"/>
				<ph:AttributeField name="value" value="5"/>
			</ph:Attribute>
			<ph:Port id="3" type="port">
				<ph:Attribute>
					<ph:AttributeField name="type" value="string"/>
					<ph:AttributeField name="name" value="type"/>
					<ph:AttributeField name="value" value="flange_a"/>
				</ph:Attribute>
			</ph:Port>
			<ph:Port id="4" type="port">
				<ph:Attribute>
					<ph:AttributeField name="type" value="string"/>
					<ph:AttributeField name="name" value="type"/>
					<ph:AttributeField name="value" value="flange_b"/>
				</ph:Attribute>
			</ph:Port>
		</ph:Element>
		<ph:Element id="5" type="Mass">
			<ph:Port id="6" type="port">
				<ph:Attribute>
					<ph:AttributeField name="type" value="string"/>
					<ph:AttributeField name="name" value="type"/>
					<ph:AttributeField name="value" value="flange_a"/>
				</ph:Attribute>
			</ph:Port>
		</ph:Element>
		<ph:Edge id="7" sourceid="1" targetid="3"/>
		<ph:Edge id="8" sourceid="4" targetid="6"/>
	</ph:Graph>
</ph:Graphs>

This is the solution I found. I still have problems to figure out how to handle the of a ph:Element if there are more than one but the output should look like (s_rel0 = 10, par_s_rel0 = 5) and not like (s_rel0 = 5)(par_s_rel0 = 5).

And the second conection should consist of flange_b and not of flange_a. I searched for while the mistake but could not find it.

<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:ph="http://www.merge.something.com">

    <xsl:output indent="yes" method="text"/>

    <xsl:template match="/">
            <xsl:apply-templates select="ph:Graphs/ph:Graph"/>
    </xsl:template>

    <xsl:template match="ph:Graph">
        <xsl:text>model </xsl:text><xsl:value-of select="@name"/><xsl:text>
</xsl:text>
        <xsl:apply-templates select="ph:Element"/>
        <xsl:text>equation
</xsl:text>
        <xsl:apply-templates select="ph:Edge"/>
        <xsl:text>end </xsl:text><xsl:value-of select="@name"/><xsl:text>;</xsl:text>
    </xsl:template>

    <xsl:template match="ph:Element">
        <xsl:text> Components.</xsl:text><xsl:value-of select="@type"/><xsl:text > </xsl:text>
        <xsl:value-of select="translate(@type, 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz')"/><xsl:value-of select="@id"/>
        <xsl:apply-templates select="ph:Attribute"/>
        <xsl:text>;
</xsl:text>
    </xsl:template>

    <xsl:template match="ph:Element/ph:Attribute">
        <xsl:choose>
           <xsl:when test="ph:AttributeField[@name = 'type' and @value='int']">
              <xsl:text>(</xsl:text><xsl:value-of select="ph:AttributeField[@name = 'name']/@value"/><xsl:text> = </xsl:text><xsl:value-of select="ph:AttributeField[@name = 'value']/@value" /><xsl:text>)</xsl:text>
           </xsl:when>
           <xsl:when test="ph:AttributeField[@name = 'type' and @value='string']">
              <xsl:text>(</xsl:text><xsl:value-of select="ph:AttributeField[@name = 'name']/@value"/><xsl:text> = '</xsl:text><xsl:value-of select="ph:AttributeField[@name = 'value']/@value" /><xsl:text>')</xsl:text>
           </xsl:when>
        </xsl:choose>
    </xsl:template>

    <xsl:template match="ph:Port/ph:Attribute">
        <xsl:if test="ph:AttributeField/@value=type">
            <xsl:apply-templates select="ph:AttributeField"/>
        </xsl:if>
    </xsl:template>

    <xsl:template match="ph:AttributeField">
    </xsl:template>

    <xsl:template match="ph:Edge">
        <xsl:variable name="sourceid" select="@sourceid"/>
        <xsl:variable name="targetid" select="@targetid"/>
        <xsl:variable name="SourceElement" select="//ph:Element[ph:Port[@id = $sourceid]]"/>
        <xsl:variable name="TargetElement" select="//ph:Element[ph:Port[@id = $targetid]]"/>
        <xsl:text> connect(</xsl:text>
        <xsl:value-of select="translate($SourceElement/@type, 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz')" />
        <xsl:value-of select="$SourceElement/@id" />
        <xsl:text>.</xsl:text>
        <xsl:value-of select="$SourceElement/ph:Port/ph:Attribute/ph:AttributeField[@name = 'value']/@value" />
        <xsl:text>,</xsl:text>
        <xsl:value-of select="translate($TargetElement/@type, 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz')" />
        <xsl:value-of select="$TargetElement/@id" />
        <xsl:text>.</xsl:text>
        <xsl:value-of select="$TargetElement/ph:Port/ph:Attribute/ph:AttributeField[@name = 'value']/@value" />
        <xsl:text >);
</xsl:text>
    </xsl:template>

</xsl:stylesheet>


The disired output should look like this:

model mass_spring_mo
 Components.Fixed fixed1;
 Components.Spring spring2(s_rel0 = 10, par_s_rel0 = 5);
 Components.Mass mass5;
equation  
 connect(fixed1.flange,spring2.flange_a);
 connect(spring2.flange_b,mass5.flange_a);
end mass_spring_mo;


Thanks in advance.
Michael

michele_muc
Newbie Poster
3 posts since May 2011
Reputation Points: 10
Solved Threads: 0
 

is in the xml xsl transformation found no error
where should come from the 10 in the xml is to find a 10 and it will not be charged


in der xml xsl umwandlung ist kein fehler zu finden
wo soll die 10 herkommen in der xml ist kein 10 zu finden und berechnet wird sie auch nicht

<?xml version="1.0" encoding="UTF-8"?>
<ph:Graphs xmlns:ph="http://www.merge.something.com" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
	<ph:Graph name="mass_spring_mo">
		<ph:Element id="0" type="Fixed">
			<ph:Port id="1" type="port">
				<ph:Attribute>
					<ph:AttributeField name="type" value="string"/>
					<ph:AttributeField name="name" value="type"/>
					<ph:AttributeField name="value" value="flange"/>
				</ph:Attribute>
			</ph:Port>
		</ph:Element>
		<ph:Element id="2" type="Spring">
			<ph:Attribute>
				<ph:AttributeField name="type" value="int"/>
				<ph:AttributeField name="name" value="s_rel0"/>
				<ph:AttributeField name="value" value="5"/>
			</ph:Attribute>
			<ph:Attribute>
				<ph:AttributeField name="type" value="int"/>
				<ph:AttributeField name="name" value="par_s_rel0"/>
				<ph:AttributeField name="value" value="5"/>
			</ph:Attribute>
			<ph:Port id="3" type="port">
				<ph:Attribute>
					<ph:AttributeField name="type" value="string"/>
					<ph:AttributeField name="name" value="type"/>
					<ph:AttributeField name="value" value="flange_a"/>
				</ph:Attribute>
			</ph:Port>
			<ph:Port id="4" type="port">
				<ph:Attribute>
					<ph:AttributeField name="type" value="string"/>
					<ph:AttributeField name="name" value="type"/>
					<ph:AttributeField name="value" value="flange_b"/>
				</ph:Attribute>
			</ph:Port>
		</ph:Element>
		<ph:Element id="5" type="Mass">
			<ph:Port id="6" type="port">
				<ph:Attribute>
					<ph:AttributeField name="type" value="string"/>
					<ph:AttributeField name="name" value="type"/>
					<ph:AttributeField name="value" value="flange_a"/>
				</ph:Attribute>
			</ph:Port>
		</ph:Element>
		<ph:Edge id="7" sourceid="1" targetid="3"/>
		<ph:Edge id="8" sourceid="4" targetid="6"/>
	</ph:Graph>
</ph:Graphs>
xml_looser
Junior Poster
179 posts since Apr 2009
Reputation Points: 16
Solved Threads: 21
 

Oh, that was my mistake. It should be a 5 of course.

michele_muc
Newbie Poster
3 posts since May 2011
Reputation Points: 10
Solved Threads: 0
 

This article has been dead for over three months

Post: Markdown Syntax: Formatting Help
You
View similar articles that have also been tagged: