在XSL上解析具有相同名称的子元素

时间:2018-11-01 01:51:01

标签: python json xml xslt

我想知道是否有一种方法可以使用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 :(得分: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)

答案 1 :(得分:0)

只需使用索引:

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

答案 2 :(得分: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文档中datalocation都只会出现一次。)

答案 3 :(得分: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>

请注意,如果它变得比这更复杂,那么您应该考虑使用模板规则。