У меня проблема с извлечением некоторых данных из этого XML-файла:
<?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: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:Element>
<ph:Edge id="17" sourceid="1" targetid="3"/>
</ph:Graph>
</ph:Graphs>
Поэтому я создал этот XSLT-файл:
<?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>
</xsl:text>
<xsl:text>equation</xsl:text>
<xsl:text>
</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:variable name="type" select="@type"/>
<xsl:variable name="id" select="@id"/>
<xsl:text>Components.</xsl:text>
<xsl:value-of select="@type"/>
<xsl:text > </xsl:text>
<xsl:value-of select="@type"/><xsl:value-of select="@id"/>
<xsl:apply-templates select="ph:Port/ph:Attribute"/>
</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:text>connect(</xsl:text>
<xsl:text >);</xsl:text>
<xsl:text>
</xsl:text>
</xsl:template>
</xsl:stylesheet>
Вывод должен выглядеть так:
model mass_spring_mo
Components.Fixed fixed1;
Components.Spring spring1(s_rel0 = 10);
equation
connect(fixed1.flange,spring1.flange_a);
end mass_spring_mo;
Моя проблема - получить соответствующее имя и тип элементов, которые должны быть подключены. Я попытался сгенерировать переменную с динамическим именем, например, id = 1, но она не работает.
Может быть, есть более простое решение для ссылки на свойства элемента!?
Если бы кто-нибудь мог дать мне подсказку, я был бы очень благодарен.
Спасибо,
Пока, Микеле