2015-10-07 2 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

Смежные вопросы