2017-03-01 70 views
0

我正尝试创建一个将XML转换为CSV的XSLT。在搜索时,我发现了很多示例,但没有找到与不重复的动态XML节点相关的任何示例。这里放置我的XML和预期的输出任何人都有任何想法如何获得下面的输出,请与我分享。将动态XML转换为CSV并且XML节点不完全重复的XSLT

我的XML是

<SttlmOblgtnRpt> 
    <RptParams> 
     <RptId>02</RptId> 
     <RptDtAndTm> 
      <DtTm>2016-12-12T00:00:00</DtTm> 
     </RptDtAndTm> 
    </RptParams> 
    <Pgntn> 
     <PgNb>11</PgNb> 
     <LastPgInd>true</LastPgInd> 
    </Pgntn> 
    <ClrMmb> 
     <PrtryId> 
      <Id>210016</Id> 
      <Issr>MEMBER</Issr> 
     </PrtryId> 
    </ClrMmb> 
</SttlmOblgtnRpt> 

我的预期输出是

RptId,DTTM,PgNb,LastPgInd,ID,ISSR

02,2016-12-12T00:00:00, 1,true,210016,MEMBER

谢谢, Mahesh。

+0

你基本上想要输出每个文本节点。做到这一点。 – cweiske

回答

0

你的问题并不完全清楚。这听起来像你想的输出数据的单个列,其中每一片叶子节点的单元:

XSLT 1.0

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output method="text" encoding="UTF-8" /> 

<xsl:template match="/"> 
    <xsl:variable name="data" select="//*[not(*)]" /> 
    <!-- header --> 
    <xsl:for-each select="$data"> 
     <xsl:value-of select="name()" /> 
     <xsl:if test="position()!=last()"> 
      <xsl:text>,</xsl:text> 
     </xsl:if> 
    </xsl:for-each> 
    <xsl:text>&#10;</xsl:text> 
    <!-- data --> 
    <xsl:for-each select="$data"> 
     <xsl:value-of select="." /> 
     <xsl:if test="position()!=last()"> 
      <xsl:text>,</xsl:text> 
     </xsl:if> 
    </xsl:for-each> 
</xsl:template> 

</xsl:stylesheet> 

应用到你的输入例子,结果将是:

RptId,DtTm,PgNb,LastPgInd,Id,Issr 
02,2016-12-12T00:00:00,11,true,210016,MEMBER 
+0

谢谢迈克尔......它工作正常。其实我对XSLT完全陌生。我有一个具有不同节点的XML文件,内部有子节点,内部节点又包含子节点,所以到那时我无法以csv格式获得正确的输出。我在下面的链接中发布了具有相应输入/输出的相同问题,请查看并与我分享XSLT逻辑。 http://stackoverflow.com/questions/42534968/xslt-to-convert-dynamic-xml-to-csv-and-the-xml-nodes-are-not-completely-repetati – Mahesh