Добавление данных из одного узла в другой в XML-документе с использованием XSLT - PullRequest
0 голосов
/ 26 июня 2018

У меня есть документ XML с двумя наборами данных. Мне нужно вывести таблицу HTML, которая объединяет данные.

XML выглядит так:

<?xml version="1.0" encoding="UTF-8"?>
<fdata>
    <RepairHistory>
        <RepairList>
            <RepairJob>
                <RepairRef>56740408</RepairRef>
                <RepairDescription>Baths</RepairDescription>
                <RepairReportedDate>20180515</RepairReportedDate>
                <RepairCompletedDate></RepairCompletedDate>
                <RepairStartDate>20180515</RepairStartDate>
            </RepairJob>
            <RepairJob>
                <RepairRef>56735043</RepairRef>
                <RepairDescription>Basins</RepairDescription>
                <RepairReportedDate>20180515</RepairReportedDate>
                <RepairCompletedDate></RepairCompletedDate>
                <RepairStartDate>20180515</RepairStartDate>
            </RepairJob>
            <RepairJob>
                <RepairRef>56740415</RepairRef>
                <RepairDescription>Showers</RepairDescription>
                <RepairReportedDate>20180515</RepairReportedDate>
                <RepairCompletedDate></RepairCompletedDate>
                <RepairStartDate>20180515</RepairStartDate>
            </RepairJob>
        </RepairList>
    </RepairHistory>
    <map>
        <entry>
            <string>GUID</string>
            <string>be0f53f5-7a09-47cd-9928-0c865b6450a5</string>
        </entry>
        <entry>
            <string>JOBNUMBER</string>
            <string>56740408</string>
        </entry>
    </map>
    <map>
        <entry>
            <string>GUID</string>
            <string>5ce2e8fe-7735-4f98-b3a9-3bd386edb338</string>
        </entry>
        <entry>
            <string>JOBNUMBER</string>
            <string>56740415</string>
        </entry>
    </map>
</fdata>

JOBNUMBER должен соответствовать RepairRef. Не все данные внизу соответствуют данным вверху. Мне нужно вывести данные в таблицу следующим образом:

Date       Ref        Details    GUID
20180515   56740408   Baths      be0f53f5-7a09-47cd-9928-0c865b6450a5
20180515   56735043   Basins     No GUID
20180515   56740415   Showers    5ce2e8fe-7735-4f98-b3a9-3bd386edb338

Я попытался вывести таблицу, используя следующий xsl, но он не работает ...

<xsl:template match="/">
    <h3>Repair history</h3>
    <table>
        <tr>
            <th>Date</th>
            <th>Ref</th>
            <th>Details</th>
            <th>GUID</th>
        </tr>               
        <xsl:apply-templates select ="//RepairJob" />
    </table>
</xsl:template>
<xsl:template match="RepairJob">
    <xsl:variable name="JobNumber" select="RepairRef" />
     <tr>
         <td><xsl:value-of select="RepairStartDate"/></td>
         <td><xsl:value-of select="RepairRef"/></td>
         <td><xsl:value-of select="RepairDescription"/></td>
         <td>
            <xsl:choose>
                <xsl:when test="count(//map//entry[2]//string[2] = $JobNumber) &gt; 0">
                     <xsl:value-of select="//map//entry[2]//string[2] = $JobNumber"/>
                </xsl:when>
                <xsl:otherwise>
                    <xsl:text>No GUID</xsl:text>
                </xsl:otherwise>
            </xsl:choose>                
        </td>
     </tr>
</xsl:template>

Я вижу, что не выбираю правильный узел для отображения, но сопоставление также не работает. Кто-нибудь может помочь?

1 Ответ

0 голосов
/ 26 июня 2018

Ваш текущий xsl:value-of оценивается как логическое значение ("истина" или "ложь"). Вы на самом деле хотите выражение ...

<xsl:value-of select="//map[entry[2]/string[2] = $JobNumber]/entry[1]/string[2]"/>

xsl:when тоже нуждается в настройке, поэтому все xsl:choose должно выглядеть так:

<xsl:choose>
    <xsl:when test="//map[entry[2]/string[2] = $JobNumber]">
         <xsl:value-of select="//map[entry[2]/string[2] = $JobNumber]/entry[1]/string[2]"/>
    </xsl:when>
    <xsl:otherwise>
        <xsl:text>No GUID</xsl:text>
    </xsl:otherwise>
</xsl:choose>    

Тем не менее, рассмотрите возможность использования ключа для поиска направляющих ....

<xsl:key name="map" match="map" use="entry[string[1] = 'JOBNUMBER']/string[2]" />

Тогда ваш xsl:value-of становится этим

<xsl:value-of select="key('map',$JobNumber)/entry[string[1] = 'GUID']/string[2]"/>

Обратите внимание, что это также позволяет элементам entry быть в любом порядке внутри элемента map (т. Е. JOBNUMBER может быть первой записью, а GUID - второй)

Попробуйте это XSLT

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">

<xsl:output method="html" indent="yes" />

<xsl:key name="map" match="map" use="entry[string[1] = 'JOBNUMBER']/string[2]" />

<xsl:template match="/">
    <h3>Repair history</h3>
    <table>
        <tr>
            <th>Date</th>
            <th>Ref</th>
            <th>Details</th>
            <th>GUID</th>
        </tr>               
        <xsl:apply-templates select ="//RepairJob" />
    </table>
</xsl:template>

<xsl:template match="RepairJob">
    <xsl:variable name="JobNumber" select="RepairRef" />
     <tr>
         <td><xsl:value-of select="RepairStartDate"/></td>
         <td><xsl:value-of select="RepairRef"/></td>
         <td><xsl:value-of select="RepairDescription"/></td>
         <td>
            <xsl:choose>
                <xsl:when test="key('map',$JobNumber)">
                     <xsl:value-of select="key('map',$JobNumber)/entry[string[1] = 'GUID']/string[2]"/>
                </xsl:when>
                <xsl:otherwise>
                    <xsl:text>No GUID</xsl:text>
                </xsl:otherwise>
            </xsl:choose>                
        </td>
     </tr>
</xsl:template>
</xsl:stylesheet>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...