XSL / XPath / XML Issue - PullRequest
       4

XSL / XPath / XML Issue

0 голосов
/ 19 сентября 2019

Мне нужна помощь с XPath.Я пытаюсь получить значение <color> в последнем <records> элементе каждого человека.

Мой текущий XPath persons/person/favourites/records[last()]/color

Мой личный XML-код

<?xml version="1.0" encoding="ISO-8859-1"?>
<persons>
    <person number="1">
    <fullname>
        <firstname>Miley</firstname>
        <lastname>Cyrus</lastname>
    </fullname>
    <favourites number="1">
     <records>
        <color>blue</color>
        <sport>tennis</sport>
    </records>

    <records>
        <color>red</color>
        <sport>soccer</sport>   
    </records>
    </favourites>
    </person>   

    <person number="2">
    <fullname>
        <firstname>Hannah</firstname>
        <lastname>Montanna</lastname>
    </fullname>
    <favourites number="2">
     <records>
        <color>pink</color>
        <sport>swimming</sport>
    </records>

    <records>
        <color>yellow</color>
        <sport>running</sport>
    </records>
    </favourites>
    </person>       
</persons>

Мой XML-код extrapersonsinfo -

<extrapersonsinfo>
    <favourites number="1">
        <fruit>apple</fruit>
    </favourites>

    <favourites number="2">
        <fruit>peach</fruit>
    </favourites>
</extrapersonsinfo>

Я хочу, чтобы XPath отображал значения красного и желтого, поскольку они являются любимыми цветами последней записи каждого человека.Вместо этого мой текущий XPath дает мне любимый цвет последней записи только от первого лица.

<h2>Person Information</h2>

 <xsl:for-each select="extrapersonsinfo/favourites">

        <table>
            <tr>
                <th>Favourites Number</th>
                <th>Last Favourite Color</th>
            </tr>
            <tr>
                <td><xsl:value-of select="@number"/></td>
                <td><xsl:value-of select="document('persons.xml')persons/person/favourites/records[last()]/color"/></td>
            </tr>
         </table>
 </xsl:for-each>

Ответы [ 2 ]

0 голосов
/ 19 сентября 2019

Я думаю, что проблема, с которой вы столкнулись, заключается в том, что, когда вы выбираете элемент person в файле "people.xml", вы не выбираете нужного вам человека.Ваш xpath получит все записи person, и если вы используете XSLT 1.0, xsl:value-of вернет значение только первого узла из тех, которые он выбрал.

Что вам нужно сделатьэто добавить условие к выбранной записи person ...

<xsl:for-each select="extrapersonsinfo/favourites">
  <xsl:variable name="number" select="@number" />
  <table>
    <tr>
      <th>Favourites Number</th>
      <th>Last Favourite Color</th>
    </tr>
    <tr>
      <td><xsl:value-of select="@number"/></td>
      <td><xsl:value-of select="document('persons.xml')/persons/person[@number=$number]/favourites/records[last()]/color"/></td>
        </tr>
     </table>
 </xsl:for-each>

(Возможно, вы хотите вместо этого условие на favourites, но оно должно дать вам идею)

0 голосов
/ 19 сентября 2019

Вы можете получить последний цвет для каждого человека с помощью xsl: for-each construct.

XSLT

<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output indent="yes"/>
    <xsl:template match="/persons">
        <root>
            <xsl:for-each select="person">
                <lastColor>
                    <xsl:value-of select="favourites/records[last()]/color"/>
                </lastColor>
            </xsl:for-each>
        </root>
    </xsl:template>
</xsl:stylesheet>

Вывод

<?xml version='1.0' ?>
<root>
    <lastColor>red</lastColor>
    <lastColor>yellow</lastColor>
</root>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...