xml
  • xslt
  • xmi
  • 2015-04-14 56 views 1 likes 
    1

    我想用xslt生成新的xmi文件,但是我在閱讀標籤名稱時遇到了xsl:for-each循環的問題,因爲它使用簡單的xml標籤可以正常工作,但是當使用xmi標籤時(例如uml:package),我沒有任何結果。 這裏是我的xml文件xsl:for-each循環與xmi文件不兼容

    <?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

    你的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> 
    
    +0

    「你XSLT確實有另一個內部」 你這是什麼意思? – Iheb

    +0

    你在第一個''。 – FiveO

    +0

    只需在for-each之前移除'''。看到我的代碼 – FiveO

    相關問題