1

如何使用 XPath(最好是 1.0)选择具有子类别值的类别列表?

结构如下:

  • 类别 (1)
    • 名称 (1)
    • 价值 (1-1)
    • 价值 (1-2)
  • 类别 (2)
    • 名称 (2)
    • 价值 (2-1)
    • 价值 (2-2)
    • 价值 (2-3)
  • 等等

所以理想情况下,我需要一个类别名称及其关联值的返回列表,例如:

  • name(1): value(1-1), value(1-2)
  • name(2): value(2-1), value(2-2), value(2-3)
  • 等等

或者理想情况下:

  • name(1) / value(1-1)
  • name(1) / value(1-2)
  • name(2) / value(2-1)
  • name(2) / value(2-2)
  • name(2) / value(2-3)

    我希望是这样/characteristics/category/[concat(name/uk, "/", value/uk)]的,但语法不正确,

或任何类似的格式,只要我可以区分主要类别和子类别,因此我可以使用适当的后端语言进一步解析该数据。

基本上,我希望实现类别及其子类别之间的关联,以便将它们存储在分层分类词汇表中。

我从提要中获得了以下 XML:

<characteristics>
  <category id="1">
    <name>
      <uk>Orientation</uk>
      <es>Orientación</es>
    </name>
    <value id="1">
      <uk>North</uk>
      <es>Norte</es>
    </value>
    <value id="2">
      <uk>East</uk>
      <es>Este</es>
    </value>
    <value id="3">
      <uk>South</uk>
      <es>Sur</es>
    </value>
    <value id="4">
      <uk>West</uk>
      <es>Oeste</es>
    </value>
  </category>
  <category id="2">
    <name>
      <uk>Condition</uk>
      <es>Estado</es>
    </name>
    <value id="1">
      <uk>Recently Refurbished</uk>
      <es>Renovado Recientemente</es>
    </value>
  </category>
  <category id="3">
    <name>
      <uk>Pool</uk>
      <es>Piscina</es>
    </name>
    <value id="1">
      <uk>Private</uk>
      <es>Privada</es>
    </value>
  </category>
  <category id="4">
    <name>
      <uk>Climate Control</uk>
      <es>Climatización</es>
    </name>
    <value id="1">
      <uk>Fireplace</uk>
      <es>Chimenea</es>
    </value>
  </category>
  <category id="5">
    <name>
      <uk>Views</uk>
      <es>Vistas</es>
    </name>
    <value id="1">
      <uk>Sea</uk>
      <es>Mar</es>
    </value>
    <value id="2">
      <uk>Mountain</uk>
      <es>Montaña</es>
    </value>
    <value id="3">
      <uk>Panoramic</uk>
      <es>Panorámicas</es>
    </value>
  </category>
  <category id="6">
    <name>
      <uk>Features</uk>
      <es>Caracteristicas</es>
    </name>
    <value id="1">
      <uk>Guest Apartment</uk>
      <es>Aprtmnt. Huéspedes</es>
    </value>
    <value id="2">
      <uk>Guest House</uk>
      <es>Casa de Huéspedes</es>
    </value>
    <value id="3">
      <uk>Barbeque</uk>
      <es>Barbacoa</es>
    </value>
  </category>
</characteristics>

这是返回第一类值的 XPath 查询:

/characteristics/category[@id=1]/name/uk | /characteristics/category[@id=1]/value/uk
<uk>Orientation</uk>
<uk>North</uk>
<uk>East</uk>
<uk>South</uk>
<uk>West</uk>

现在我如何组合、比较或反向引用这两个id并使其动态地为每个类别工作?

知道如何生成这样的 XPath 查询吗?

我还尝试了../.., parent::, ancestor::,[]等表达式和条件的不同组合,但没有成功。我也尝试过使用,但它在这个演示string-join中不起作用,其次我试图解析它的代码不支持XPath 2.0。

或者,最接近/相似的选择/格式允许我列出并区分不同类别的名称及其相关值,以便我可以用不同的语言进一步解析该结构?


其他尝试:

  • concat(/characteristics/category[@id=@id]/name/uk, "/", /characteristics/category[@id=@id]/value/uk)

    仅返回第一个元素:(Orientation/North不需要[@id=@id]

  • concat(/characteristics/category/*/*[name()="uk"]/node(), /characteristics/category)

    创建一些我不理解的层次结构(它是哪种格式):

    Orientation
          Orientation
          Orientación
    
          North
          Norte
    
          East
          Este
    
          South
          Sur
    
          West
          Oeste
    

    但仅适用于第一个主要类别

4

2 回答 2

2

XPath 用于选择,而不是用于操作。您可以选择出现在输入 XML 文档中的节点;您不能随意重新排列这些节点,尤其是使用 XPath 1.0。如果要重新排列节点,请使用 XSLT 或其他调用 XPath 库的语言。

更新:即使在您的评论和对您的问题的更新之后,您仍然坚持认为 XPath 1.0 评估的结果可能不仅仅是从输入 XML 文档中选择的节点列表。想要层次结构而不是列表表明您对 XPath 1.0 期望过高。

最后更新...

XPath 2.0 解决方案

给定您的输入 XML,这个 XPath 2.0 表达式:

for $c in //category 
    return for $v in $c/value 
               return concat($c/name/uk, ' / ', $v/uk)

将产生

Orientation / North
Orientation / East
Orientation / South
Orientation / West
Condition / Recently Refurbished
Pool / Private
Climate Control / Fireplace
Views / Sea
Views / Mountain
Views / Panoramic
Features / Guest Apartment
Features / Guest House
Features / Barbeque

按照要求。

于 2015-10-21T22:51:44.747 回答
0

最接近的 XPath 1.0 查询是:

characteristics/category/*/*[name()="uk"]/text()

这将返回项目的平面列表:

Orientation
North
East
South
West
Condition
Recently Refurbished
...

它将以正确的顺序(主要和子类别)返回所有项目,但没有任何层次结构。

缺点是需要在其他地方检测和管理层次结构。例如,在 Drupal CMS 中,我确实将此类 XML 提要导入到分类术语中,因此在我手动排列项目的层次结构后,使用现有名称的下一次导入将保持这种层次结构。

于 2016-03-11T13:01:44.770 回答