Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
带嵌套元素的XML到CSV(xsltproc)_Xml_Bash_Xslt_Csv - Fatal编程技术网

带嵌套元素的XML到CSV(xsltproc)

带嵌套元素的XML到CSV(xsltproc),xml,bash,xslt,csv,Xml,Bash,Xslt,Csv,我正在尝试使用xsltproc将XML转换为CSV 我现在有 --XSL template <xsl:strip-space elements="*" /> <xsl:template match="/*/child::*"> <xsl:for-each select="child::*"> <xsl:if test="position() != last()">"<xsl:value-of select="normalize-space(

我正在尝试使用xsltproc将XML转换为CSV

我现在有

--XSL template
<xsl:strip-space elements="*" />

<xsl:template match="/*/child::*">
<xsl:for-each select="child::*">
<xsl:if test="position() != last()">"<xsl:value-of select="normalize-space(.)"/>",            </xsl:if>
<xsl:if test="position()  = last()">"<xsl:value-of select="normalize-space(.)"/>"  <xsl:text>&#xD;</xsl:text>
</xsl:if>
</xsl:for-each>
</xsl:template>

--XML (they are two separate files 
    <root>
<summary>
    <field1>a</field1>
    <field2>b</field2>
    <field3>c</field3>
    <field4>d</field4>
        <data>
            <field5>e</field5>
            <field6>f</field6>
        </data>
        <user_info>
            <field7>g</field7>
            <field8>h</field8>
        </user_info>
   </summary>
 </root>

在变量中存储名称以字段开头的所有元素。然后,在$fields的内容上迭代两次。第一次,输出所有元素名称,第二次输出每个元素的内容

这样,您就不必干预嵌套结构。这一行:

<xsl:if test="position() != last()">

请发布一个源XML和预期输出的示例。恐怕这不是一个好的示例:元素名称无效,包含空格。结果中包括哪些元素也不清楚。理想情况下,您应该提前知道XML结构,因此可以通过名称和路径显式地命名它们。否则,您将需要一些选择条件,例如:元素的名称以字段开头。
<xsl:if test="position() != last()">
<?xml version="1.0" encoding="utf-8"?>

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:output method="text"/>
<xsl:strip-space elements="*"/>

<xsl:variable name="fields" select="//*[starts-with(name(),'field')]"/>

<xsl:template match="/root">
  <xsl:for-each select="$fields">
     <xsl:value-of select="name()"/>
     <xsl:if test="position() != last()">
        <xsl:text>,&#32;</xsl:text>
     </xsl:if>
  </xsl:for-each>

  <xsl:text>&#10;</xsl:text>

  <xsl:for-each select="$fields">
     <xsl:text>"</xsl:text>
     <xsl:value-of select="."/>
     <xsl:text>"</xsl:text>
     <xsl:if test="position() != last()">
        <xsl:text>,&#32;</xsl:text>
     </xsl:if>
  </xsl:for-each>
</xsl:template>

</xsl:stylesheet>
field1, field2, field3, field4, field5, field6, field7, field8
"a", "b", "c", "d", "e", "f", "g", "h"