【问题标题】:Parsing child elements with the same name on XSL在 XSL 上解析同名子元素
【发布时间】:2018-11-01 01:51:00
【问题描述】:

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

如何区分纬度和经度?

【问题讨论】:

  • 您实际上只能区分第一个和第二个坐标元素,它们不是实际坐标,它们是每个坐标的一半。所以最好的解决方案是正确命名元素,因为现在你得到两个坐标元素并假设第一个是 lat(或 long),另一个是 long(或 lat)。显然,如果您不能影响 xml 结构,则以下答案之一提供了解决方案。

标签: python json xml xslt


【解决方案1】:

不是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]

如果你有更多的对,你可以用奇数和偶数来分开它们。或者使用 2 阶段流程,首先选择 location,它将返回位置标签,然后为每个标签返回一个 (x,y) 对。

【讨论】:

    【解决方案2】:

    简单地使用索引:

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

    【讨论】:

      【解决方案3】:

      由于您已将其标记为 python,我假设您使用的是 libxslt,即 XSLT 1.0。在 XSLT 1.0 中,指令:

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

      从第一个location 中的first coordinates 获取值。


      要从第二个coordinates 获取值,您可以使用:

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

      或者干脆改变你的:

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

      到:

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

      (这是假设在 XML 文档中datalocation 只会出现一次)。

      【讨论】:

        【解决方案4】:

        只需添加另一层循环,例如:

        <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>
        

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

        【讨论】:

          猜你喜欢
          • 2011-09-30
          • 1970-01-01
          • 2021-12-29
          • 1970-01-01
          • 1970-01-01
          • 2011-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-11-02
          相关资源
          最近更新 更多