XPath对所有匹配的同级节点进行连接

XPath对所有匹配的同级节点进行连接,xpath,saxon,xpath-2.0,Xpath,Saxon,Xpath 2.0,我还没有找到类似的解决方案,所以我希望有人能帮助我。我有如下XML(摘录): 我尝试了以下解决方案(XPath 1.0或XPath 2.0都可以使用),但总是只返回第一个匹配项“主题:大气条件” for$n in/*/gmd:identificationInfo/*/gmd:descriptiveKeywords/gmd:MD_关键字返回字符串联接($n/gmd:type/*/@codeListValue',:', $n/gmd:keyword/*/text(),“”) /*/gmd:iden

我还没有找到类似的解决方案,所以我希望有人能帮助我。我有如下XML(摘录):

我尝试了以下解决方案(XPath 1.0或XPath 2.0都可以使用),但总是只返回第一个匹配项“主题:大气条件”

  • for$n in/*/gmd:identificationInfo/*/gmd:descriptiveKeywords/gmd:MD_关键字返回字符串联接($n/gmd:type/*/@codeListValue',:',
    $n/gmd:keyword/*/text(),“”)
  • /*/gmd:identificationInfo/*/gmd:descriptiveKeywords/gmd:MD_Keywords/gmd:Keywords/concat(*/text(),':',../gmd:type/*/@codeListValue)
  • //gmd:descriptiveKeywords/*/string连接((gmd:type/*/@codeListValue,
    gmd:keyword/*/text()[1]),“:”)
  • //gmd:descriptiveKeywords/*/gmd:keyword/concat(以下同级::gmd:type/*/@codeListValue',:',./*/text())
如果XPath看起来是正确的,那么我将使用Java中的
Saxon HE 9.x

我确实发现,求值返回的是字符串,而不是节点集,我可能需要有多个结果。哪个XPath将返回节点集


谢谢你的帮助

XPath 2.0表达式
//gco:CharacterString/concat(祖先::MD_Keywords/type/MD_KeywordTypeCode/@codeListValue,,:,)
返回()三个字符串的序列

theme:Atmospheric conditions
socialBenefitArea:Agriculture
socialBenefitArea:Biodiversity

我不明白为什么要请求节点集,因为XPath 2.0不返回节点集,而是返回节点序列或基本值。由于您的结果不包含在节点中,但您希望连接包含在不同节点中的字符串,我不认为输入中选择的节点会有什么帮助,如果您想创建新节点,那么您需要XSLT或XQuery。

我怀疑字符串和节点集的混淆是因为您使用的是JAXP API,它是为XPath1.0设计的,不允许您充分利用XPath2.0的灵活性。如@Martin Honnen所建议的,如果希望从XPath表达式返回字符串序列,则需要使用s9api API:这将处理完整的XPath 2.0数据模型。使用JAXP和节点集结果无法绕过此限制,因为XPath不允许创建新节点(仅用于选择现有节点),并且所需字符串与现有节点不对应


但是,如果您确实受限于JAXP,那么您可以通过使用string-join()函数和一些合适的分隔符(例如换行符)将查询更改为将结果合并为单个字符串,并通过在调用Java代码中标记化将其拆分为多个结果。

只需使用即可:

/*/*/*/*/MD_Keywords/keyword/*/concat(../../type/*/@codeListValue, ': ', .)

哪个XPath将返回节点集

Xpath 3.0表达式可以使用标准函数生成节点(-set),例如

theme:Atmospheric conditions
socialBenefitArea:Agriculture
socialBenefitArea:Biodiversity
/*/*/*/*/MD_Keywords/keyword/*/concat(../../type/*/@codeListValue, ': ', .)