首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用XSL将XMI转换为XML

使用XSL将XMI转换为XML
EN

Stack Overflow用户
提问于 2015-08-28 15:14:22
回答 1查看 332关注 0票数 1

我正在尝试解析node中的xmi:type。但不能成功做到这一点。我附上了输入文件(uml - xmi格式),我的xslt输入和我得到的输出(xml格式)。每当我看到"xmi:type = uml:OpaqueAction“时,我想修改输出来写一行。我可以访问同一行中的"name“,但不能访问xmi:type。不知道为什么

UML-XMI输入

代码语言:javascript
复制
<?xml version="1.0" encoding="UTF-8"?>
<uml:Model xmi:version="20110701" xmlns:xmi="http://www.omg.org/spec/XMI/20110701" xmlns:uml="http://www.eclipse.org/uml2/4.0.0/UML" xmi:id="_OlYJkC9-EeWyX7UKkcyxiw" name="model">
    <packagedElement xmi:type="uml:Activity" xmi:id="_OlYJkS9-EeWyX7UKkcyxiw" name="Activity1" node="_XjLyEC9-EeWyX7UKkcyxiw _ZfIhYC9-EeWyX7UKkcyxiw _cK4V8C9-EeWyX7UKkcyxiw _fE2zwC9-EeWyX7UKkcyxiw _F67sgC9_EeWyX7UKkcyxiw">
        <edge xmi:type="uml:ControlFlow" xmi:id="_jzMLIC9-EeWyX7UKkcyxiw" name="ControlFlow" source="_XjLyEC9-EeWyX7UKkcyxiw" target="_ZfIhYC9-EeWyX7UKkcyxiw"/>
        <edge xmi:type="uml:ControlFlow" xmi:id="_lieXcC9-EeWyX7UKkcyxiw" name="ControlFlow1" source="_ZfIhYC9-EeWyX7UKkcyxiw" target="_cK4V8C9-EeWyX7UKkcyxiw"/>
        <edge xmi:type="uml:ControlFlow" xmi:id="_m0Vn8C9-EeWyX7UKkcyxiw" name="Timer expired" source="_cK4V8C9-EeWyX7UKkcyxiw" target="_fE2zwC9-EeWyX7UKkcyxiw"/>
        <edge xmi:type="uml:ControlFlow" xmi:id="_wrhvgC9-EeWyX7UKkcyxiw" name="Timer not expired" source="_cK4V8C9-EeWyX7UKkcyxiw" target="_cK4V8C9-EeWyX7UKkcyxiw"/>
        <edge xmi:type="uml:ControlFlow" xmi:id="_Hcj3UC9_EeWyX7UKkcyxiw" name="ControlFlow2" source="_fE2zwC9-EeWyX7UKkcyxiw" target="_F67sgC9_EeWyX7UKkcyxiw"/>
        <node xmi:type="uml:InitialNode" xmi:id="_XjLyEC9-EeWyX7UKkcyxiw" name="Start" outgoing="_jzMLIC9-EeWyX7UKkcyxiw"/>
        <node xmi:type="uml:OpaqueAction" xmi:id="_ZfIhYC9-EeWyX7UKkcyxiw" name="Load and Enable Timer" visibility="package" outgoing="_lieXcC9-EeWyX7UKkcyxiw" incoming="_jzMLIC9-EeWyX7UKkcyxiw"/>
        <node xmi:type="uml:DecisionNode" xmi:id="_cK4V8C9-EeWyX7UKkcyxiw" name="Has timer expired?" outgoing="_m0Vn8C9-EeWyX7UKkcyxiw _wrhvgC9-EeWyX7UKkcyxiw" incoming="_lieXcC9-EeWyX7UKkcyxiw _wrhvgC9-EeWyX7UKkcyxiw"/>
        <node xmi:type="uml:OpaqueAction" xmi:id="_fE2zwC9-EeWyX7UKkcyxiw" name="Service the Timer ISR" outgoing="_Hcj3UC9_EeWyX7UKkcyxiw" incoming="_m0Vn8C9-EeWyX7UKkcyxiw">
            <inputValue xmi:type="uml:ActionInputPin" xmi:id="_82lIMDRBEeWdiarL2UAMaQ" name="interrupt">
                <upperBound xmi:type="uml:LiteralInteger" xmi:id="_82lIMTRBEeWdiarL2UAMaQ" value="1"/>
            </inputValue>
        </node>
        <node xmi:type="uml:ActivityFinalNode" xmi:id="_F67sgC9_EeWyX7UKkcyxiw" name="ActivityFinalNode" incoming="_Hcj3UC9_EeWyX7UKkcyxiw"/>
    </packagedElement>
</uml:Model>

XSLT输入

代码语言:javascript
复制
<xsl:stylesheet version="1.0" xmlns:UML="http://www.eclipse.org/uml2/4.0.0/UML" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns='uri:sadf' exclude-result-prefixes="UML">
<xsl:output method="xml" omit-xml-declaration="yes" encoding="UTF-8" indent="yes" />
<xsl:template match="/UML:Model">
    <?xml version="1.0"?>
    <sdf3 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="1.0" type="fsmsadf" xsi:noNamespaceSchemaLocation="http://www.es.ele.tue.nl/sdf3/xsd/sdf3-fsmsadf.xsd">
    <applicationGraph name="g">
        <xsl:apply-templates />
    </applicationGraph>
</sdf3>
</xsl:template>
<xsl:template match="packagedElement">
    <fsmsadf>
    <scenariograph name="sg0" type="t">
        <xsl:apply-templates select="node" />
    </scenariograph>
    </fsmsadf>
</xsl:template>
<xsl:template match="node">
     <xsl:if test="@'xmi:type'='uml:OpaqueAction'">
         <actor name="{@name}" source="{@outgoing}" />
     </xsl:if>
</xsl:template>
</xsl:stylesheet>

输出(.XML)

代码语言:javascript
复制
<?xml version="1.0" encoding="UTF-8"?>
<sdf3 xmlns="uri:sadf" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="http://www.es.ele.tue.nl/sdf3/xsd/sdf3-fsmsadf.xsd" type="fsmsadf" version="1.0">
<applicationGraph name="g">
<fsmsadf>
     <scenariograph type="t" name="sg0" />
#Need these lines      <actor name="Load and Enable Timer" source="whatever_input is here">
#Need these lines        <actor name="Service the timer ISR" source="whatever_input is here">
</fsmsadf>
</applicationGraph>
</sdf3>
EN

回答 1

Stack Overflow用户

发布于 2015-08-28 15:48:51

这一行有一个问题:

代码语言:javascript
复制
<xsl:if test="@'xmi:type'='uml:OpaqueAction'">

正确的语法应该是:

代码语言:javascript
复制
<xsl:if test="@xmi:type='uml:OpaqueAction'">

您不需要在属性名称周围使用撇号。您只需要将它们包含在字符串周围即可。您还需要在XSLT中声明xmi名称空间,名称空间URI与XML中的名称空间URI相匹配。如果您已经尝试运行XSLT,这应该会在错误消息中突出显示。

实际上,在此之前会出现另一个错误,因为这些行是无效的

代码语言:javascript
复制
<xsl:template match="/UML:Model">
     <?xml version="1.0"?>

也许这只是您的问题的一个拼写错误,应该在XSLT的开头出现,但是如果您实际上试图在输出XML中包含xml声明,那么只需在xsl:output元素中将omit-xml-declaration更改为"no“即可。

试试这个XSLT

代码语言:javascript
复制
<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns='uri:sadf'
 xmlns:UML="http://www.eclipse.org/uml2/4.0.0/UML" 
 xmlns:xmi="http://www.omg.org/spec/XMI/20110701"
 exclude-result-prefixes="UML xmi">
<xsl:output method="xml" omit-xml-declaration="no" encoding="UTF-8" indent="yes" />

<xsl:template match="/UML:Model">
    <sdf3 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="1.0" type="fsmsadf" xsi:noNamespaceSchemaLocation="http://www.es.ele.tue.nl/sdf3/xsd/sdf3-fsmsadf.xsd">
    <applicationGraph name="g">
        <xsl:apply-templates />
    </applicationGraph>
</sdf3>
</xsl:template>

<xsl:template match="packagedElement">
    <fsmsadf>
    <scenariograph name="sg0" type="t">
        <xsl:apply-templates select="node" />
    </scenariograph>
    </fsmsadf>
</xsl:template>

<xsl:template match="node">
     <xsl:if test="@xmi:type='uml:OpaqueAction'">
         <actor name="{@name}" source="{@outgoing}" />
     </xsl:if>
</xsl:template>
</xsl:stylesheet>
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32265326

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档