Разбор дочерних элементов с одинаковыми именами в XSL

1

Мне интересно, есть ли способ передать родительский элемент со всеми его дочерними элементами, которые имеют одно и то же имя элемента, используя 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) для обоих.

Как я могу разграничить широту и долготу?

  • 0
    На самом деле вы можете различать только первый и второй элемент координат, которые не являются фактическими координатами, они представляют собой половину координаты, которую он соединяет. Таким образом, самым лучшим решением было бы правильно назвать элементы, потому что теперь вы получаете два координатных элемента и предполагаете, что первый - это lat (или long), а другой - long (или lat). Очевидно, что если вы не можете повлиять на структуру xml, то один из приведенных ниже ответов предоставит решение.
Теги:
xslt

4 ответа

0

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

<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

Поскольку вы отметили это как 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

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

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

Не 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).

Ещё вопросы

Сообщество Overcoder
Наверх
Меню