使用xslt将XML转换为csv以特定格式输出多个值
我正在尝试使用xslt将以下格式的xml数据转换为csv格式。我现在正在尝试为特定的自定义字段输出多值。 这是我的xml数据使用xslt将XML转换为csv以特定格式输出多个值,xslt,xpath,csv,xslt-1.0,Xslt,Xpath,Csv,Xslt 1.0,我正在尝试使用xslt将以下格式的xml数据转换为csv格式。我现在正在尝试为特定的自定义字段输出多值。 这是我的xml数据 <input-xml> <add add-value="First Name"> <value type="string">Newbee</value> </add> <add add-value="Surname"> <value type="string">
<input-xml>
<add add-value="First Name">
<value type="string">Newbee</value>
</add>
<add add-value="Surname">
<value type="string">user1</value>
</add>
<add add-value="Title">
<value type="string">Software,engineer</value>
</add>
<add add-value="Title">
<value type="string">Associate level</value>
</add>
<add add-value="Description">
<value type="string">This user is new to xslt.</value>
</add>
</input-xml>
只要没有多个值,这是绝对正确的。
现在的问题是字段“Title”有两个值,必须用引号(“”)括起来,如下所示。
预期输出csv数据:
Newbee,User1,"|Software engineer|,|Associate level|",This user is new to xslt.
我不知道我必须对上面的代码做哪些更改,以及如何进一步进行。。
有人能帮我吗
@LarsH您之前对我发布的问题的回答很好..我发现对于下面的xml格式,xslt的工作方式与期望的不太一样
<input-xml>
<add add-value="First Name">
<value type="string">Newbee</value>
</add>
<add add-value="Surname">
<value type="string">user1</value>
<add add-value="Title">
<value type="string">Associate level</value>
<value type="string">Software,engineer</value>
</add>
<add add-value="Description">
<value type="string">This user is new to xslt.</value>
</add>
</input-xml>
我是否需要编写另一个xslt来处理此xml。。?我可以修改现有的xslt本身来处理这两种xml变体吗?我会更改输出字段模板,这样它就不会将值作为输出,而是使用字段的名称(属性)。例如,传递一个
字段名
参数,而不是字段值
。然后,您可以将有关多个值的逻辑放入该模板中
[再想一想,您也可以像以前那样传递字段值*s*,只是认识到您传递的是一个节点集,而不一定只是一个值。]
在输出字段模板中,您可以说:
<xsl:template name="output-field">
<xsl:param name="field-name"/>
<xsl:variable name="field-values" select="*[@attr-name = $field-name]" />
<xsl:choose>
<xsl:when test="count($field-values) > 1">
<xsl:text>"</xsl:text>
<xsl:for-each select="$field-values">
<xsl:value-of select="concat('|', ., '|')" />
<xsl:if test="position() != last()">,</xsl:if>
</xsl:for-each>
<xsl:text>"</xsl:text>
</xsl:when>
<xsl:when test="contains($field-values[1], $delimiter)">
... the rest of your existing template
</xsl:choose>
</xsl:template>
"
,
"
... 现有模板的其余部分
如果您在这些细节方面需要更多帮助,请告诉我们哪些细节。Farhan,我的回答对您有帮助吗?如果没有,请告诉我们您还需要什么。如果它解决了您的问题,请不要忘记选中“accept”绿色复选标记。@LarsH,因此对模板输出的调用字段将类似于以下内容:
,依此类推。。是的,除非您需要用单引号传递字符串参数值(在select
属性的双引号内):
<input-xml>
<add add-value="First Name">
<value type="string">Newbee</value>
</add>
<add add-value="Surname">
<value type="string">user1</value>
<add add-value="Title">
<value type="string">Associate level</value>
<value type="string">Software,engineer</value>
</add>
<add add-value="Description">
<value type="string">This user is new to xslt.</value>
</add>
</input-xml>
Newbee,User1,Software engineerAssociate level,This user is new to xslt.
<xsl:template name="output-field">
<xsl:param name="field-name"/>
<xsl:variable name="field-values" select="*[@attr-name = $field-name]" />
<xsl:choose>
<xsl:when test="count($field-values) > 1">
<xsl:text>"</xsl:text>
<xsl:for-each select="$field-values">
<xsl:value-of select="concat('|', ., '|')" />
<xsl:if test="position() != last()">,</xsl:if>
</xsl:for-each>
<xsl:text>"</xsl:text>
</xsl:when>
<xsl:when test="contains($field-values[1], $delimiter)">
... the rest of your existing template
</xsl:choose>
</xsl:template>