2015-10-07 199 views
0

我有以下XMl。我想讀取基於類型值的開始和結束日期。當類型爲「O」時,讀取O的開始日期和結束日期,併爲類型「L」讀取相同的日期。日期是可選的。xslt基於前一個元素的下一個元素值

 <Person id="1"> 
     <Date> 
      <Type value="O"/> 
      <Start value="2009-04-01"/> 
      <End value="2012-03-31"/> 
     </Date> 
     <Date> 
      <Type value="L"/> 
      <Start value="2009-01-31"/> 
     </Date> 
     </Person> 
     <Person id="2"> 
     <Date> 
      <Type value="O"/> 
      <Start value="2009-01-11"/> 
     </Date> 
     </Person> 

我收到以下XSLT代碼。但它正在閱讀和梳理兩者中的開始/結束日期。

<xsl:choose> 
    <xsl:when test="Date/Type[@value = 'O']"> 
     <xsl:value-of select="Date/Start/@value"/><xsl:value-of select="$separator" /> 
     <xsl:value-of select="Date/End/@value"/><xsl:value-of select="$separator" /> 
    </xsl:when> 
    <xsl:otherwise> 
     <xsl:value-of select="$separator" /><xsl:value-of select="$separator" /> 
    </xsl:otherwise> 
</xsl:choose> 
     <xsl:choose> 
    <xsl:when test="Date/Type[@value = 'L']"> 
     <xsl:value-of select="Date/Start/@value"/><xsl:value-of select="$separator" /> 
     <xsl:value-of select="Date/End/@value"/><xsl:value-of select="$separator" /> 
    </xsl:when> 
    <xsl:otherwise> 
     <xsl:value-of select="$separator" /><xsl:value-of select="$separator" /> 
    </xsl:otherwise> 
</xsl:choose> 

的願望輸出爲CSV

"2009-04-01","2012-03-31","2009-01-31","" 
    "2009-01-11","","","" 
+0

請發表您所需的輸出根據您輸入的XML以上的XML。 –

+0

@ JoelM.Lamsen:我已經用期望的輸出更新了問題。謝謝 – user3202862

回答

1

試試這個XSLT:

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 

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

    <xsl:template match="/"> 
     <xsl:for-each select="root/Person"> 
      <xsl:if test="position() &gt; 1"> 
       <xsl:text>&#xA;</xsl:text> 
      </xsl:if> 
      <xsl:choose> 
       <xsl:when test="Date[Type[@value='O']]"> 
        <xsl:apply-templates select="Date[Type[@value='O']]"/> 
       </xsl:when> 
       <xsl:otherwise> 
        <xsl:text>&quot;&quot;,&quot;&quot;</xsl:text> 
       </xsl:otherwise> 
      </xsl:choose> 
      <xsl:choose> 
       <xsl:when test="Date[Type[@value='L']]"> 
        <xsl:apply-templates select="Date[Type[@value='L']]"/> 
       </xsl:when> 
       <xsl:otherwise> 
        <xsl:text>,&quot;&quot;,&quot;&quot;</xsl:text> 
       </xsl:otherwise> 
      </xsl:choose> 
     </xsl:for-each> 
    </xsl:template> 

    <xsl:template match="root/Person/Date[Type[@value='O']]"> 
     <xsl:value-of select="if (Start) then concat('&quot;', Start/@value, '&quot;') else concat('&quot;', '&quot;')"/> 
     <xsl:text>,</xsl:text> 
     <xsl:value-of select="if (End) then concat('&quot;', End/@value, '&quot;') else concat('&quot;', '&quot;')"/> 
    </xsl:template> 

    <xsl:template match="root/Person/Date[Type[@value='L']]"> 
     <xsl:text>,</xsl:text> 
     <xsl:value-of select="if (Start) then concat('&quot;', Start/@value, '&quot;') else concat('&quot;', '&quot;')"/> 
     <xsl:text>,</xsl:text> 
     <xsl:value-of select="if (End) then concat('&quot;', End/@value, '&quot;') else concat('&quot;', '&quot;')"/> 
    </xsl:template> 

</xsl:stylesheet> 
+0

非常感謝它的工作。 – user3202862

相關問題