我在从这个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,但它不起作用。 也许有一个更简单的解决方案来引用元素的属性!?
如果有人能给我一个提示,我将非常感激。
谢谢, 再见米歇尔
答案 0 :(得分:2)
这是一个模板。 您可以看到我使用了不同于行结尾的方法。 此外,通过在ph:Edge模板中定义SourceElement和TargetElement变量来完成回顾。我只选择ph:Element元素和相应的ph:Port子元素,其id与ph:Edge的sourceid属性相匹配。一旦你能够识别它们,就可以很容易地引用它们的属性了。
<?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>