Мне интересно, есть ли способ передать родительский элемент со всеми его дочерними элементами, которые имеют одно и то же имя элемента, используя 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) для обоих.
Как я могу разграничить широту и долготу?
Просто добавьте еще один уровень цикла, например:
<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>
Обратите внимание, что если он становится более сложным, чем это, вы должны подумать об использовании правил шаблонов.
Поскольку вы отметили это как 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
).
Просто используйте индекс:
<xsl:value-of select="location/coordinates[1]"/>
<xsl:value-of select="location/coordinates[2]"/>
Не 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)
.