使用XSL转换XML

时间:2016-02-04 21:13:35

标签: xml xslt

所以我已经达到了我自己似乎无法解决问题的程度。 我必须转换这个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="1678901234">
        <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årdnadsavare1@gmail.com</e-post>
    </vardnadshavare>

    <vardnadshavare personnummer="1789012345">
        <fornamn>ABCs</fornamn>
        <efternamn>Vårdnadsavare2</efternamn>
        <adress>FakeFake Street</adress>
        <telefon hem="031333333" />
        <e-post>Vårdnadsavare2@gmail.com</e-post>
    </vardnadshavare>
</ansokan>

所有这些元素和属性只应在元素&#34; vardnadshavare&#34; 中输出属性&#34; Personnumer&#34; fornamn efternamn 。像这样:

<begaranominkomstuppgift>       
    <person personnummer="1456789012">       
        <fornamn>ABCs</fornamn>        
        <efternamn>Vårdnadsavare1</efternamn>       
    </person>       
    <person personnummer="1789012345">        
        <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 个答案:

答案 0 :(得分:1)

正如@ Filburt所写,你匹配错误的根元素。

您修改过的xsl:

.chr

答案 1 :(得分: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>