使用XSLT2.0实现CSV到XML的转换

使用XSLT2.0实现CSV到XML的转换,xml,xslt,csv,transformation,Xml,Xslt,Csv,Transformation,我一直在尝试编写一个2.0版本的XSLT,以将CSV数据(再次嵌入XML元素)转换为XML 下面是我的CSV数据示例 <csv> "Id","Success","Created","Error" "001P000000aXgRAIA0","true","true","" "","false","false","REQUIRED_FIELD_MISSING:Required fields are missing: [Name, Man1__c, man2__c]:Name Man1__

我一直在尝试编写一个2.0版本的XSLT,以将CSV数据(再次嵌入XML元素)转换为XML

下面是我的CSV数据示例

<csv>
"Id","Success","Created","Error"
"001P000000aXgRAIA0","true","true",""
"","false","false","REQUIRED_FIELD_MISSING:Required fields are missing: [Name, Man1__c, man2__c]:Name Man1__c man2__c --"
</csv>

“Id”、“成功”、“已创建”、“错误”
“001P000000AXGRIA0”、“真”、“真”
“”、“false”、“false”、“REQUIRED_FIELD_MISSING:REQUIRED fields_MISSING:[名称、Man1__c、man2_c]:名称Man1_c man2_c--”
这里的第一行是标题字段 对于上面的数据,我的输出XML应该是

<results xmlns = "http://www.force.com/2009/06/asyncapi/dataload">
    <result>
        <id>001D000000ISUr3IAH</id>
        <success>true</success>
        <created>true</created>
    </result>
    <result>
        <errors>
            <fields>Name</fields>
            <fields>Man1__c</fields>
            <fields>man2__c</fields>
            <message>Required fields are missing: [Name, Man1__c, man2__c]</message>
            <statusCode>REQUIRED_FIELD_MISSING</statusCode>
        </errors>
        <success>false</success>
        <created>false</created>
    </result>
</results>

001D000000ISUr3IAH
真的
真的
名称
曼努克
曼努克
缺少必填字段:[名称、Man1\uuuu c、man2\uuu c]
必填字段\缺失
假的
假的
我的转换应该有以下逻辑来执行转换

正如您在第一条记录中看到的(不是标题行,实际上是csv数据中的第二行) success值为true,因此结果将按原样填充id、success和created信息

对于第二行,success为false,因此结果中没有id元素,但应该填充错误。 要填充错误,应解析CSV数据中的错误字段,并将:(冒号)的第一个标记放在statusCode元素中,将:(冒号)的最后一个标记放在字段中(通过用空格分隔进行解析),其余中间字符串应放在错误的消息字段中

我在这里搜索了示例XSLT,但找不到如何开始。
您能帮我从示例XSLT开始吗?这样我就可以实现这一目标了?

这可能不会100%适用于您的所有数据,但它适用于给定的示例,应该可以为您提供一个良好的开端

XML输入

<csv>
"Id","Success","Created","Error"
"001P000000aXgRAIA0","true","true",""
"","false","false","REQUIRED_FIELD_MISSING:Required fields are missing: [Name, Man1__c, man2__c]:Name Man1__c man2__c --"
</csv>
<results xmlns="http://www.force.com/2009/06/asyncapi/dataload">
   <result>
      <id>001P000000aXgRAIA0</id>
      <success>true</success>
      <created>true</created>
   </result>
   <result>
      <errors>
         <fields>Name</fields>
         <fields>Man1__c</fields>
         <fields>man2__c</fields>
         <message>Required fields are missing: [Name, Man1__c, man2__c]</message>
         <statusCode>REQUIRED_FIELD_MISSING</statusCode>
      </errors>
      <success>false</success>
      <created>false</created>
   </result>
</results>

“Id”、“成功”、“已创建”、“错误”
“001P000000AXGRIA0”、“真”、“真”
“”、“false”、“false”、“REQUIRED_FIELD_MISSING:REQUIRED fields_MISSING:[名称、Man1__c、man2_c]:名称Man1_c man2_c--”
XSLT2.0

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output indent="yes"/>
    <xsl:strip-space elements="*"/>

    <xsl:template match="@*|node()">
        <xsl:copy>
            <xsl:apply-templates select="@*|node()"/>
        </xsl:copy>
    </xsl:template>

    <xsl:template match="csv">
        <results xmlns="http://www.force.com/2009/06/asyncapi/dataload">
            <xsl:analyze-string select="." regex="(.*)\n">
                <xsl:matching-substring>
                    <xsl:if test="not(regex-group(1)='' or contains(regex-group(1),'Id'))">
                        <result>
                            <xsl:variable name="fields" as="element()">
                                <fields>
                                    <xsl:analyze-string select="regex-group(1)" regex="&quot;([^&quot;]*)&quot;,?">
                                        <xsl:matching-substring>
                                            <field>
                                                <xsl:value-of select="regex-group(1)"/>                                             
                                            </field>
                                        </xsl:matching-substring>
                                    </xsl:analyze-string>                                                                   
                                </fields>
                            </xsl:variable>
                            <xsl:choose>
                                <xsl:when test="$fields/*[2]='true'">
                                    <id><xsl:value-of select="$fields/*[1]"/></id>
                                    <success><xsl:value-of select="$fields/*[2]"/></success>
                                    <created><xsl:value-of select="$fields/*[3]"/></created>
                                </xsl:when>
                                <xsl:otherwise>
                                    <errors>
                                        <xsl:variable name="errorTokens" select="tokenize($fields/*[4],':')"/>
                                        <xsl:for-each select="tokenize(substring-before(substring-after($errorTokens[3],'['),']'),',')">
                                            <fields><xsl:value-of select="normalize-space(.)"/></fields>                                            
                                        </xsl:for-each>
                                        <message><xsl:value-of select="$errorTokens[not(position()=1) and not(position()=4)]" separator=":"/></message>
                                        <statusCode><xsl:value-of select="$errorTokens[1]"/></statusCode>
                                    </errors>
                                    <success><xsl:value-of select="$fields/*[2]"/></success>
                                    <created><xsl:value-of select="$fields/*[3]"/></created>
                                </xsl:otherwise>
                            </xsl:choose>
                        </result>
                    </xsl:if>
                </xsl:matching-substring>
            </xsl:analyze-string>
        </results>
    </xsl:template>

</xsl:stylesheet>


嗨Daniel Haley这真的很酷。这很有效。我修改了它,使我的不同输入工作。谢谢你的帮助。多亏了stackoverflow。使用XSLT分析字符串和正则表达式组函数,我已经成为XSLT的粉丝。太棒了。谢谢你的回复。满分。@RaghavendraNilekani-很高兴我能帮上忙!