如何使用XSLT将分隔的字符串转换为变量中定义的xml结构

时间:2014-02-25 17:53:49

标签: xml arrays parsing xslt

我需要将制表符分隔的字符串解析为变量中定义的xml节点结构。我使用tokenize()将字符串转换为“数组”变量,并有一个变量,告诉我应根据其位置给出数组中每个元素的标记。我在数组上执行for-each并将其中的每个元素分配给xml标记以生成输出。

这是输入:

<Data>Jane Doe /t Atlantis /t 4-1-1999 /t jane@doe.com<Data>

这是XSLT:

<xsl:variable name="MyXMLStructure">
    <Field Position="1">Name</Field>
    <Field Position="2">Location</Field>
    <Field Position="3">DateOfBirth</Field>
    <Field Position="4">Email</Field>
</xsl:variable>

<xsl:template name="processData">
    <xsl:param name="pText"/>

    <xsl:variable name="DataFields" select="tokenize($pText, '&#x9;')"/>
    <xsl:element name="PersonData">

        <xsl:for-each select="$DataFields">
            <xsl:element name="{$MyXMLStructure/Field[@Position = position()]}">
                 <xsl:value-of select="."/>
            </xsl:element>
        </xsl:for-each>
    </xsl:element>

</xsl:template>

<xsl:template match="/">
    <xsl:call-template name="processData">
        <xsl:with-param name="pText" select="/Data"/>
    </xsl:call-template>
</xsl:template>

这是预期的输出:

<PersonData>
     <Name>Jane Doe</Name>
     <Location>Atlantis</Location>
     <DateOfBirth>4-1-1999</DateOfBirth>
     <Email>jane@doe.com</Email>
</PersonData>

我收到此错误:

Invalid Element Name. Invalid QName {Name Location ...}

我猜测数组的position()工作不正常,并且没有正确分配元素的名称。

请帮忙!

编辑:编辑过的XSLT代码

1 个答案:

答案 0 :(得分:2)

我想你想要

    <xsl:for-each select="$DataFields">
        <xsl:variable name="pos" select="position()"/>
        <xsl:element name="{$MyXMLStructure/Field[@Position = $pos]}">
             <xsl:value-of select="normalize-space()"/>
        </xsl:element>
    </xsl:for-each>

要获得更有效的访问权限,您可以定义密钥<xsl:key name="k1" match="Field" use="xs:integer(@Position)"/>,然后使用<xsl:element name="{key('k1', position(), $MyXMLStructure)}">