2016-02-04 126 views
1

所以我已經達到了我自己無法解決問題的程度。 我必須變換該XML代碼:用XSL轉換XML

<?xml version="1.0" encoding="utf-8"?> 
<?xml-stylesheet type="text/xsl" href="xml.xsl"?> 
<ansokan> 
    <forskolaNamn>FakeFörskola</forskolaNamn> 

    <barn personnummer="1234567890"> 
     <namn>Abc</namn> 
     <allergi>Räkor</allergi> 
     <övrigt> </övrigt> 
    </barn> 

    <syskon personnummer="16789"> 
     <namn>ABCs Bror</namn> 
    </syskon> 

    <vardnadshavare personnummer="1456789012"> 
     <fornamn>ABCs</fornamn> 
     <efternamn>Vårdnadsavare1</efternamn> 
     <adress>Fake Street</adress> 
     <telefon hem="031111111" mobil="0731234567"/> 
     <e-post>Vå[email protected]</e-post> 
    </vardnadshavare> 

    <vardnadshavare personnummer="1789"> 
     <fornamn>ABCs</fornamn> 
     <efternamn>Vårdnadsavare2</efternamn> 
     <adress>FakeFake Street</adress> 
     <telefon hem="031333333" /> 
     <e-post>Vå[email protected]</e-post> 
    </vardnadshavare> 
</ansokan> 

所有這些元素和屬性的應該只輸出屬性「Personnumer」在元件「vardnadshavare」和元件,fornamnefternamn。像這樣:

<begaranominkomstuppgift>       
    <person personnummer="1456789012">        
   <fornamn>ABCs</fornamn>         
     <efternamn>Vårdnadsavare1</efternamn>       
    </person>       
    <person personnummer="1789">         
     <fornamn>ABCs</fornamn>         
     <efternamn>Vårdnadsavare2</efternamn>       
    </person>    
</begaranominkomstuppgift> 

,這是我的XSL代碼:

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output method="xml" indent="yes"/> 
    <xsl:template match="ansokningar"> 
     <begaranominkomstuppgift> 
      <xsl:for-each select="ansokan/vardnadshavare"> 
       <person> 
        <xsl:attribute name="personnummer"> 
         <xsl:value-of select="@personnummer"/> 
        </xsl:attribute> 
        <fornamn> 
         <xsl:value-of select="fornamn"/> 
        </fornamn> 
        <efternamn> 
         <xsl:value-of select="efternamn"/> 
        </efternamn> 
       </person> 
      </xsl:for-each> 
     </begaranominkomstuppgift> 
    </xsl:template> 
</xsl:stylesheet> 

沒有出來時,我對代碼進行測試。順便說一句,XML代碼是有效的。

+2

你的根元素是'ansokan',而你的模板匹配' ansokningar'。 – Filburt

回答

1

由於@Filburt寫道,你匹配錯誤的根元素。

你修改的xsl:

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output method="xml" indent="yes"/> 
    <xsl:template match="ansokan"> 
     <begaranominkomstuppgift> 
      <xsl:for-each select="vardnadshavare"> 
       <person> 
        <xsl:attribute name="personnummer"> 
         <xsl:value-of select="@personnummer"/> 
        </xsl:attribute> 
        <fornamn> 
         <xsl:value-of select="fornamn"/> 
        </fornamn> 
        <efternamn> 
         <xsl:value-of select="efternamn"/> 
        </efternamn> 
       </person> 
      </xsl:for-each> 
     </begaranominkomstuppgift> 
    </xsl:template> 
</xsl:stylesheet> 
1

我想是因爲我喜歡的模板了for-each添加一個稍微不同的方法:

<?xml version="1.0" encoding="utf-8"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output method="xml" indent="yes"/> 

    <!-- start out with document root template --> 
    <xsl:template match="/"> 
     <xsl:apply-templates /> 
    </xsl:template> 

    <!-- match new root element --> 
    <xsl:template match="ansokan"> 
     <xsl:element name="begaranominkomstuppgift"> 
      <xsl:apply-templates /> 
     </xsl:element> 
    </xsl:template> 

    <!-- match new person element --> 
    <xsl:template match="vardnadshavare"> 
     <xsl:element name="person"> 
      <xsl:attribute name="personnummer"> 
       <xsl:value-of select="./@personnummer" /> 
      </xsl:attribute> 
      <xsl:apply-templates /> 
     </xsl:element> 
    </xsl:template> 

    <!-- empty templates for those elements to ignore --> 
    <xsl:template match="forskolaNamn" /> 
    <xsl:template match="barn" /> 
    <xsl:template match="syskon" /> 
    <xsl:template match="adress" /> 
    <xsl:template match="telefon" /> 
    <xsl:template match="e-post" /> 

    <!-- identity template for copying those elements that need no transformation --> 
    <xsl:template match="@* | node()"> 
     <xsl:copy> 
      <xsl:apply-templates select="@* | node()"/> 
     </xsl:copy> 
    </xsl:template> 
</xsl:stylesheet> 
+0

它可能看起來有點複雜,並且比你手頭的任務所需要的要複雜得多,但它可能會給你一個更大任務的想法。 – Filburt

+0

是的,不能說我理解它的每一個部分,但它看起來並不壞。我必須要做的XSD更難讀/寫。 – JKA