gpt4 book ai didi

xml - 如何返回同一级别的子类别?

转载 作者:行者123 更新时间:2023-12-03 17:32:02 25 4
gpt4 key购买 nike

如何使用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)],但是语法不正确,


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

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

我从Feed中获取了以下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,但在此 demo中不起作用,其次是我试图解析 doesn't support 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


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

最佳答案

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


按照要求。

关于xml - 如何返回同一级别的子类别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33270509/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com