XSLT current-group выбирает первый и последний элемент - PullRequest
0 голосов
/ 23 сентября 2018

У меня есть этот xml:

    <LocatorInfo>
        <LocationAddr>
            <StreetNum>182</StreetNum>
            <StreetName>Eastern Avenue</StreetName>
            <City>Fall River</City>
            <StateProv>MA</StateProv>
            <PostalCode>02723</PostalCode>
            <Country>USA</Country>
            <GEOCode>
                <Latitude>41.694600119635915</Latitude>
                <Longitude>-71.13038416718094</Longitude>
            </GEOCode>
        </LocationAddr>
        <LocationTimestamp>4/6/2018 4:17:37 PM</LocationTimestamp>
        <LocationDistance>4.338 miles</LocationDistance>
        <Accuracy>1.985 miles</Accuracy>
    </LocatorInfo>
    <LocatorInfo>
    <LocationAddr>
      <StreetNum>285</StreetNum>
      <StreetName>Wastern Avenue</StreetName>
      <City>Ball River</City>
      <StateProv>MA</StateProv>
      <PostalCode>02723</PostalCode>
      <Country>USA</Country>
      <GEOCode>
        <Latitude>41.694600119635915</Latitude>
        <Longitude>-71.13038416718094</Longitude>
      </GEOCode>
    </LocationAddr>
    <LocationTimestamp>4/7/2018 7:00:03 AM</LocationTimestamp>
    <LocationDistance>4.338 miles</LocationDistance>
    <Accuracy>1.985 miles</Accuracy>
  </LocatorInfo>
<LocatorInfo>
        <LocationAddr>
            <StreetNum>182</StreetNum>
            <StreetName>Eastern Avenue</StreetName>
            <City>Fall River</City>
            <StateProv>MA</StateProv>
            <PostalCode>02723</PostalCode>
            <Country>USA</Country>
            <GEOCode>
                <Latitude>41.694600119635915</Latitude>
                <Longitude>-71.13038416718094</Longitude>
            </GEOCode>
        </LocationAddr>
        <LocationTimestamp>4/7/2018 4:17:37 PM</LocationTimestamp>
        <LocationDistance>4.338 miles</LocationDistance>
        <Accuracy>1.985 miles</Accuracy>
    </LocatorInfo>

У меня есть эта часть xslt:

<xsl:for-each-group select="n1:MBMDVRs/mbg:LocatorInfo" group-by="string-join((mbg:LocationAddr/mbg:StreetNum, mbg:LocationAddr/mbg:StreetName, mbg:LocationAddr/mbg:City, mbg:LocationAddr/mbg:StateProv), '!')">
                                                    <tr style="border-collapse:collapse; font-size:inherit; text-align:center; " class="wide">
                                                        <td style="width:0.95in; ">
                                                        </td> 
                                                        <td style="width:2.57in; "> 
                                                            <xsl:copy-of select="mbg:LocationAddr/mbg:StreetNum, mbg:LocationAddr/mbg:StreetName, mbg:LocationAddr/mbg:City, mbg:LocationAddr/mbg:StateProv" />
                                                        </td>
                                                        <td style="width:1.50in; "> 
                                                        <xsl:for-each select="current-group()">
                                                            <xsl:copy-of select="(//mbg:LocationTimestamp)[last()]"/>
                                                            </xsl:for-each>
                                                        </td>
                                                        <td style="width:2.13in; ">
                                                        <xsl:for-each select="current-group()">
                                                            <xsl:copy-of select="mbg:LocationTimestamp[1]"/>
                                                            </xsl:for-each>
                                                        </td>
                                                        <td style="width:2.27in; ">
                                                             <xsl:value-of select="count(current-group())" />
                                                        </td>
                                                    </tr>
                                                       </xsl:for-each-group>

Я не могу понять, почему последняя и [1] команды неработать в этом случае.Они ничего не делают.Я хочу получить первую метку времени для каждой группы в одном тд и последнюю метку времени в другом тд.Но они собираются вместе в обеих клетках.Он возвращает тот же результат, либо если я использую [1] и последний или нет.Это потому, что отметка времени отсутствует в группе?Как я могу обойти это?Не знаю, возможно ли так, или мне нужно попробовать совершенно другим способом.

Пространства имен используются правильно, я просто оставил их вне xml.

1 Ответ

0 голосов
/ 23 сентября 2018

Добавьте необходимые скобки во второе выражение, как показано ниже.В вашем примере кода первое и последнее значения выводятся дважды из-за xsl:for-each (не знаю, для чего это нужно).

<td style="width:1.50in; "> 
    <xsl:for-each select="current-group()">
        <xsl:copy-of select="(//mbg:LocationTimestamp)[last()]"/>
    </xsl:for-each>
</td>
<td style="width:2.13in; ">
    <xsl:for-each select="current-group()">
        <xsl:copy-of select="(//mbg:LocationTimestamp)[1]"/>
    </xsl:for-each>
</td>

Вывод (частичный):

<td style="width:1.50in; ">    <!-- last() -->
    <LocationTimestamp xmlns="mbg.com">4/7/2018 4:17:37 PM</LocationTimestamp>
    <LocationTimestamp xmlns="mbg.com">4/7/2018 4:17:37 PM</LocationTimestamp>
</td>
<td style="width:2.13in; ">   <!-- [1] -->
    <LocationTimestamp xmlns="mbg.com">4/6/2018 4:17:37 PM</LocationTimestamp>
    <LocationTimestamp xmlns="mbg.com">4/6/2018 4:17:37 PM</LocationTimestamp>
</td>
...
<td style="width:1.50in; ">    <!-- last() -->
    <LocationTimestamp xmlns="mbg.com">4/7/2018 4:17:37 PM</LocationTimestamp>
</td>
<td style="width:2.13in; ">    <!-- [1] -->
    <LocationTimestamp xmlns="mbg.com">4/6/2018 4:17:37 PM</LocationTimestamp>
</td>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...