2015-04-10 7 views
1

Я использую следующий XSL для преобразования XML в CSV на основе более раннего запроса SO.Соответствие шаблону XSLT для преобразования CSV

XML:

<Rows> 
<Row> 
<LoanNumber>123456</LoanNumber> 
<DateReceived>2015-04-10</DateReceived> 
<DateClosed>2015-04-10</DateClosed> 
</Row> 
<Row> 
<LoanNumber>9988776</LoanNumber> 
<DateReceived>2015-04-10</DateReceived> 
<DateClosed/> 
</Row> 
</Rows> 

XSL:

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

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

<xsl:template match="/*/child::*"> 
<xsl:for-each select="child::*"> 
<xsl:if test="position() = 1"><xsl:value-of select="normalize-space(.)"/>,OPEN,</xsl:if> 
<xsl:if test="position() != 1 and position() != last()"><xsl:value-of select="normalize-space(.)"/>,</xsl:if> 
<xsl:if test="position() = last()"><xsl:value-of select="normalize-space(.)"/><xsl:text>&#xD;</xsl:text> 
</xsl:if> 
</xsl:for-each> 
</xsl:template> 

</xsl:stylesheet> 

Я хотел бы иметь возможность вывести следующий CSV для указанных строк

123456, CLOSED, 2015-04-10, 2015-04-10 
9988776, OPEN, 2015-04-10, 

Я предположил, что я может достичь этого, имея 2 шаблона, один из которых выводит текст OPEN, где элемент <DateClosed> является нулевым, а один выводит e текст ЗАКРЫТО, где нет.

Однако я не понимаю соответствия шаблона, которое использовалось достаточно хорошо, чтобы понять, как это сделать. Может ли это требование удовлетворяться даже в одном шаблоне?

+0

Ожидается выход определенно правильно ваш? Не следует ли ЗАКРЫТЬ строку для 123456? –

+0

Вы правы, спасибо. Отредактировано для исправления. –

+0

@BenL Пожалуйста, не редактируйте код OP - вы не знаете, как он выглядит. –

ответ

2

Ваш выход не соответствует вашему входу. Предполагая, что вы хотите, чтобы результат показать LoanNumber, статус, DateReceived, DateClosed я хотел бы предложить вам попробовать это так:

XSLT 1,0

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

<xsl:template match="/Rows"> 
    <xsl:for-each select="Row"> 
     <xsl:value-of select="LoanNumber"/> 
     <xsl:text>,</xsl:text> 
     <xsl:choose> 
      <xsl:when test="string(DateClosed)">CLOSED,</xsl:when> 
      <xsl:otherwise>OPEN,</xsl:otherwise> 
     </xsl:choose> 
     <xsl:value-of select="DateReceived"/> 
     <xsl:text>,</xsl:text> 
     <xsl:value-of select="DateClosed"/> 
     <xsl:text>&#10;</xsl:text> 
    </xsl:for-each> 
</xsl:template> 

</xsl:stylesheet> 
+0

Спасибо - я отредактировал результат, чтобы соответствовать, даст это. –

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