使用XSLT进行XML转换1

时间:2014-11-13 14:45:39

标签: xml xslt

今天我真的在与XSLT斗争,我已经很长时间不得不使用它了。我要编辑一些 xml和我不能使用XSLT 2.0。所以我必须使用1.0。 xml im struugling是(基本示例):

我尝试为2个节点制作模板,然后“调用”该模板以创建具有所需值的新节点,但这也没有用,如果有人能指出我正确的方向,我会遗漏一些东西。

<messagemap>
    <author>
        <au_id>274-80-9391</au_id>
        <au_lname>Straight</au_lname>
        <au_fname>Dean</au_fname>
        <phone>415 834-2919</phone>
        <address>5420 College Av.</address>
        <city>Oakland</city>
        <state>CA</state>
        <zip>94609</zip>
        <contract>1</contract>
    </author>
</messagemap>

XM:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output indent="yes"/>
    <!--Identity Transform.-->
    <xsl:template match="node()|@*">
        <xsl:copy>
            <xsl:apply-templates select="node()|@*"/>
        </xsl:copy>
    </xsl:template>
   
    <xsl:template match="au_fname | au_lname">
        <company>
            <xsl:value-of select="."/>
        </company>
    </xsl:template>    
</xsl:stylesheet>

我得到的结果是:

<messagemap>
    <author>
        <au_id>274-80-9391</au_id>
        <company>Straight</company>
        <company>Dean</company>
        <phone>415 834-2919</phone>
        <address>5420 College Av.</address>
        <city>Oakland</city>
        <state>CA</state>
        <zip>94609</zip>
        <contract>1</contract>
    </author>
</messagemap>

我需要的是:

<messagemap>
    <author>
        <au_id>274-80-9391</au_id>
        <company>Dean Straight</company>
        <phone>415 834-2919</phone>
        <address>5420 College Av.</address>
        <city>Oakland</city>
        <state>CA</state>
        <zip>94609</zip>
        <contract>1</contract>
    </author>
</messagemap>

1 个答案:

答案 0 :(得分:3)

您可以尝试匹配au_fname并构建company。然后你可以剥离au_lname

XSLT 1.0

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output indent="yes"/>
    <xsl:strip-space elements="*"/>

    <!--Identity Transform.-->
    <xsl:template match="node()|@*">
        <xsl:copy>
            <xsl:apply-templates select="node()|@*"/>
        </xsl:copy>
    </xsl:template>

    <xsl:template match="au_fname">
        <company>
            <xsl:value-of select="normalize-space(concat(.,' ',../au_lname))"/>
        </company>
    </xsl:template>

    <xsl:template match="au_lname"/>

</xsl:stylesheet>