2013-05-27 70 views
1

我一直在尝试编写2.0版本的XSLT以将CSV数据(再次嵌入到XML元素中)转换为XML。使用XSLT 2.0进行CSV到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> 

在此,第一行头字段 和用于上述数据我的输出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> 

和我的转换应具有遵循逻辑来执行转换。

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

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

我在这里搜索了示例XSLT,无法得到如何开始。 你能帮我从样本XSLT开始,以便我可以开发实现这一目标吗?

回答

2

对于您的所有数据,这可能无法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> 

XSLT 2.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> 

XML输出

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

您好丹尼尔海利 钍真的很酷。这工作。我修改了它来完成不同的输入工作。谢谢您的帮助。感谢stackoverflow。 使用XSLT **分析字符串**和**正则表达式组**函数,我已经成为XSLT的粉丝。它真棒。 感谢您的回复。满分。 –

+0

@RaghavendraNilekani - 很高兴能帮到你! –