2013-10-29 160 views
2

下面是一個示例XML文件:解析遞歸的XML使用XSL來生成CSV文件

<PubmedArticleSet> 
<PubmedArticle> 
<MedlineCitation Owner="NLM" Status="MEDLINE"> 
    <PMID Version="1">23458631</PMID> 
    <DateCreated> 
     <Year>2013</Year> 
     <Month>04</Month> 
     <Day>08</Day> 
    </DateCreated> 
    <MeshHeadingList> 
     <MeshHeading> 
      <DescriptorName MajorTopicYN="N">Animals</DescriptorName> 
     </MeshHeading> 
     <MeshHeading> 
      <DescriptorName MajorTopicYN="N">Calcium</DescriptorName> 
      <QualifierName MajorTopicYN="Y">metabolism</QualifierName> 
     </MeshHeading> 
     <MeshHeading> 
      <DescriptorName MajorTopicYN="N">Calcium Chloride</DescriptorName> 
      <QualifierName MajorTopicYN="N">administration &amp; dosage</QualifierName> 
     </MeshHeading> 
    </MeshHeadingList> 
</MedlineCitation> 
</PubmedArticle> 
<PubmedArticle> 
<MedlineCitation Status="Publisher" Owner="NLM"> 
    <PMID Version="1">23458629</PMID> 
    <DateCreated> 
     <Year>2013</Year> 
     <Month>3</Month> 
     <Day>20</Day> 
    </DateCreated> 
    <MeshHeadingList> 
     <MeshHeading> 
      <DescriptorName MajorTopicYN="N">Adolescent</DescriptorName> 
     </MeshHeading> 
     <MeshHeading> 
      <DescriptorName MajorTopicYN="N">Adult</DescriptorName> 
     </MeshHeading> 
     <MeshHeading> 
      <DescriptorName MajorTopicYN="N">Anthropometry</DescriptorName> 
     </MeshHeading> 
    </MeshHeadingList> 
</MedlineCitation> 
</PubmedArticle> 
</PubmedArticleSet> 

我想使用XSL解析XML文件並提取PMID,dateCreated會,所有DescriptorName和MajorTopicYN每篇文章。然後,將結果保存在如下所示的csv文件中:

ArticleID|CreatedDate|MeSH|IsMajor 
23458631|20130408|Animals|N 
23458631|20130408|Calcium|N 
23458631|20130408|Calcium Chloride|N 
23458629|20130320|Adolescent|N 
23458629|20130320|Adult|N 
23458629|20130320|Anthropometry|N 

謝謝。

+0

我看不到「遞歸」位在哪裏。我看到這裏沒有遞歸... –

回答

2

這裏是你想要的東西:

<?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" version="1.0" encoding="UTF-8" indent="yes"/> 

    <xsl:variable name="newline"> 
     <xsl:text>&#10;</xsl:text> 
    </xsl:variable> 

    <xsl:variable name="carriagereturn"> 
     <xsl:text>&#13;</xsl:text> 
    </xsl:variable> 

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

    <xsl:template match="/"> 
     <xsl:text>ArticleID|CreatedDate|MeSH|IsMajor</xsl:text> 
     <xsl:value-of select="$carriagereturn" /> 

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

    <xsl:template match="DescriptorName"> 
     <xsl:value-of select="ancestor::MedlineCitation/PMID" /> 
     <xsl:text>|</xsl:text> 

     <xsl:value-of select="ancestor::MedlineCitation/DateCreated/Year" /> 
     <xsl:value-of select="ancestor::MedlineCitation/DateCreated/Month" /> 
     <xsl:value-of select="ancestor::MedlineCitation/DateCreated/Day" /> 
     <xsl:text>|</xsl:text> 

     <xsl:value-of select="." /> 
     <xsl:text>|</xsl:text> 

     <xsl:value-of select="@MajorTopicYN" /> 

     <xsl:value-of select="$carriagereturn" /> 
    </xsl:template> 
</xsl:stylesheet> 

祝你好運吧!

+0

非常感謝! – user9594

+0

如果我想處理多個XML文件(相同的結構)並將結果保存在同一個.txt文件中。我需要在xsl文件中更改什麼? – user9594

+0

什麼都沒有。認爲你應該改變這個xml的輸入代碼,並保存輸出 –