Как перебрать несколько входных файлов XML и скопировать соответствующие значения атрибутов в строку в выходной таблице HTML - PullRequest
0 голосов
/ 24 мая 2018

Я пытаюсь перебрать несколько входных файлов, создавая таблицу в выходном HTML-файле, где каждая строка соответствует обзору, но я не могу получить соответствующее значение @date и скопировать его в соответствующую ячейкустол.Любая помощь будет принята с благодарностью.

Входные файлы XML

Файл 1

<review rid="id_001" date="2018-03-20">
    <pc pid="pc_001">
        <result>...</result>
    </pc>
    <pc pid="pc_002">
        <result>...</result>
    </pc>
</review>

Файл 2

<review rid="id_002" date="2018-05-19">
    <pc pid="pc_001">
        <result>...</result>
    </pc>
    <pc pid="pc_002">
        <result>...</result>
    </pc>
</review>

Требуемый вывод HTML

<!-- @pid value outside the table as header. --> 
<table>    
    <tr>
        <td>Review ID</td>
        <td>Date</td>
        <td>Result</td>
    </tr>
    <tr>
        <td>001</td>
        <td>2018-03-20</td>
        <td>...</td>
    </tr>
        <td>002</td>
        <td>2018-05-19</td>
        <td>...</td>
    </tr>
</table>

XSLT

<xsl:variable name="files" select="collection('../?select=*.xml')"/>
<xsl:template match="/">
<!-- @pid value outside the table as header. --> 
    <table>
        <tr>
            <td>Review ID</td>
            <td>Date</td>
            <td>Result</td>
        </tr>
        <xsl:if test="$files">          
            <xsl:for-each select="distinct-values($files/review/@rid)">
                <xsl:variable name="currentRid" select="distinct-values($files/review/@rid)"/>            
                <xsl:variable name="currentPid" select="distinct-values($files/review/pc/@pid)"/> 
                <tr>
                    <td>                  
                        <xsl:value-of select="."/>
                    </td>
                    <td>
                        <xsl:for-each select="distinct-values($files/review/@date)">                     
                            <xsl:value-of select="."/>
                        </xsl:for-each>
                    </td>
                    <td>
                        <xsl:value-of select="distinct-values($files/review[@rid=$currentRid]/pc[@pid=$currentPid]/result)"/>
                    </td>
                </tr>
            </xsl:for-each>
        </xsl:if>      
        </tr>
    </table>
</xsl:template>

1 Ответ

0 голосов
/ 24 мая 2018

Проблема заключалась в том, что вы пытались перебрать все review значения элемента @date.Ограничение выражения for-each элементом review, соответствующим current() rid, как вы сделали в следующем выражении xsl:value-of, дает желаемый результат.Так что измените

<xsl:for-each select="distinct-values($files/review/@date)">

на

<xsl:for-each select="distinct-values($files/review[@rid=current()]/@date)">  

Я не могу оценить, является ли xsl:for-each даже необходимым - это зависит от большей картины - но, возможно, достаточно следующего выражения

<xsl:value-of select="$files/review[@rid=current()]/@date"/>
...