我需要将制表符分隔的字符串解析为变量中定义的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, '	')"/>
<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代码
答案 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)}">
。