xsl:for-each循环不能与xmi文件一起使用

时间:2015-04-14 11:01:37

标签: xml xslt xmi

我想使用xslt生成新的xmi文件,但是我在读取标签名称时遇到了xsl:for-each循环的问题,因为它适用于简单的xml标签但是在使用xmi标签时( uml:package例如)我没有结果。 这是我的xml文件

<?xml version="1.0" encoding='UTF-8'?>
<XMI xmi.version='1.2' timestamp='Thu Mar 26 11:55:39 CET 2015' xmlns:UML='omg.org/UML/2.0' >
<UML:Namespace.ownedElement>
<UML:Package xmi.id='_9_0_bc102e5_1427365805826_580042_22' name='migration'>
</UML:Package>
<UML:Package xmi.id='_9_0_bc102e5_1427365805826_580042_22' name='migration'>
<UML:Class xmi.id='_9_0_bc102e5_1427367042666_255023_151' name='Employee'>
</UML:Class>
</UML:Package>
</UML:Namespace.ownedElement>
</XMI>

和我的xsl文件:

<?xml version="1.0" encoding='UTF-8'?>
<xsl:stylesheet  xmlns:UML="href://org.omg/UML/1.4" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xmi="http://www.omg.org/XMI"   version="1.0">
<xsl:output indent="yes" method="xml"/>

<xsl:template match="XMI">
<XMI>
    <xsl:attribute name="xmi.version">2.1</xsl:attribute>
    <xsl:attribute name="timestamp">
                    <xsl:value-of select='XMI/@timestamp'/>
                    </xsl:attribute>
<xsl:template match="UML:Namespace.ownedElement">
<xsl:for-each select="UML:Package">
<packagedElement>
            <xsl:attribute name="xmi:type">uml:package</xsl:attribute>
            <xsl:attribute name="xmi.id">
                     <xsl:value-of select='../../@xmi.id'/>
            </xsl:attribute>
            <xsl:attribute name="name">
                     <xsl:value-of select='@name'/>
            </xsl:attribute>


<packagedElement>
            <xsl:attribute name="xmi:type">uml:Class</xsl:attribute>
            <xsl:attribute name="xmi.id">
                     <xsl:value-of select='@xmi.id'/>
            </xsl:attribute>
            <xsl:attribute name="name">
                     <xsl:value-of select='@name'/>
            </xsl:attribute>
 </packagedElement>
 </packagedElement>
</xsl:for-each>
</xsl:template>
</XMI>
</xsl:template>
</xsl:stylesheet>

这是我得到的结果:

<?xml version="1.0" encoding="UTF-8"?>
<XMI xmi.version="2.1" timestamp="" xmlns:UML="org.omg/UML/1.4"
    xmlns:xs="http://www.w3.org/2001/XMLSchema" />

1 个答案:

答案 0 :(得分:1)

您的XSLT在另一个内部确实有<xsl:template../>。这不起作用。第二个问题是xmlns:UML在XML和XSLT omg.org/UML/2.0href://org.omg/UML/1.4中没有两个不同的名称空间。

纠正这个问题,然后才行。在这里我的XSLT:                   

    <xsl:template match="XMI">
        <XMI>
            <xsl:attribute name="xmi.version">2.1</xsl:attribute>
            <xsl:attribute name="timestamp">
                <xsl:value-of select='XMI/@timestamp'/>
            </xsl:attribute>
            <xsl:for-each select="*/UML:Package">
                <packagedElement>
                    <xsl:attribute name="xmi:type">uml:package</xsl:attribute>
                    <xsl:attribute name="xmi.id">
                        <xsl:value-of select='../../@xmi.id'/>
                    </xsl:attribute>
                    <xsl:attribute name="name">
                        <xsl:value-of select='@name'/>
                    </xsl:attribute>                    

                    <packagedElement>
                        <xsl:attribute name="xmi:type">uml:Class</xsl:attribute>
                        <xsl:attribute name="xmi.id">
                            <xsl:value-of select='@xmi.id'/>
                        </xsl:attribute>
                        <xsl:attribute name="name">
                            <xsl:value-of select='@name'/>
                        </xsl:attribute>
                    </packagedElement>
                </packagedElement>
            </xsl:for-each>
        </XMI>
    </xsl:template>   

</xsl:stylesheet>

给出这个输出:

<?xml version="1.0" encoding="UTF-8"?>
<XMI xmlns:UML="omg.org/UML/2.0"
    xmlns:xmi="...omg.org/XMI"
    xmi.version="2.1"
    timestamp="">
    <packagedElement xmi:type="uml:package" xmi.id="" name="migration">
        <packagedElement xmi:type="uml:Class"
            xmi.id="_9_0_bc102e5_1427365805826_580042_22"
            name="migration"/>
    </packagedElement>
    <packagedElement xmi:type="uml:package" xmi.id="" name="migration">
        <packagedElement xmi:type="uml:Class"
            xmi.id="_9_0_bc102e5_1427365805826_580042_22"
            name="migration"/>
    </packagedElement>
</XMI>