使用xslt将XML转换为csv以特定格式输出多个值

使用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">

我正在尝试使用xslt将以下格式的xml数据转换为csv格式。我现在正在尝试为特定的自定义字段输出多值。 这是我的xml数据

<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>