Разбор дочерних элементов с одинаковыми именами в XSL - PullRequest
0 голосов
/ 01 ноября 2018

Мне интересно, есть ли способ передать через родительский элемент со всеми его дочерними элементами, которые имеют одинаковое имя элемента, используя XSL.

Например:

Это мой XML-код

<all>
    <data>
        <location>
            <coordinates>-80.326897</coordinates>
            <coordinates>25.586399</coordinates>
        </location>
    </data>
    <status>success</status>
</all>

Я анализирую это как:

<xsl:for-each select="/all/data">
<xsl:value-of select="location/coordinates"/></b></center></td>
<xsl:value-of select="location/coordinates"/></b></center></td>

Очевидно, я хотел бы получить значения широты и долготы, но, конечно, я получаю одинаковое значение (-80,32) для обоих.

Как сделать так, чтобы оно различало широту и долготу?

Ответы [ 4 ]

0 голосов
/ 01 ноября 2018

Просто добавьте еще один уровень зацикливания, например:

<xsl:for-each select="/all/data">
  <div>
    <xsl:for-each select="location/coordinates">
       <b><xsl:value-of select="."/></b>
    </xsl:for-each>
  </div>
</xsl:for-each>

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

0 голосов
/ 01 ноября 2018

Просто используйте индекс:

<xsl:value-of select="location/coordinates[1]"/>
<xsl:value-of select="location/coordinates[2]"/>
0 голосов
/ 01 ноября 2018

Поскольку вы отметили это как python, я предполагаю, что вы используете libxslt, то есть XSLT 1.0. В XSLT 1.0 инструкция:

<xsl:value-of select="location/coordinates"/>

получает значение из первого coordinates первого location.


Чтобы получить значение из второго coordinates, вы могли бы использовать:

<xsl:value-of select="location/coordinates[2]"/>

или просто измените свой:

<xsl:for-each select="/all/data">

до:

<xsl:for-each select="/all/data/location/coordinates">

(предполагается, что в XML-документе будет только одно вхождение data и location).

0 голосов
/ 01 ноября 2018

Не XSL, но так как вы пометили python, я предлагаю вам использовать BeautifulSoup

from bs4 import BeautifulSoup

c = """
<all>
    <data>
        <location>
            <coordinates>-80.326897</coordinates>
            <coordinates>25.586399</coordinates>
        </location>
    </data>
    <status>success</status>
</all>
"""

soup = BeautifulSoup(c, 'lxml')
selection = soup.select('location coordinates')
selection = [float(e.text) for e in selection]

>>> selection
[-80.326897, 25.586399]

Если у вас было больше пар, вы можете использовать нечетные и четные для их разделения. Или используйте двухэтапный процесс, сначала выберите location, который вернет метки местоположения, затем для каждого из них верните пару (x,y).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...