Я не нашел решение в подобной теме, поэтому я надеюсь, что кто-то может мне помочь. У меня есть XML следующим образом (выдержка):XPath concat все совпадения родственных узлов
<root>
<identificationInfo>
<MD_DataIdentification>
<descriptiveKeywords>
<MD_Keywords>
<keyword>
<gco:CharacterString>Atmospheric conditions</gco:CharacterString>
</keyword>
<type>
<MD_KeywordTypeCode codeListValue="theme"/>
</type>
</MD_Keywords>
</descriptiveKeywords>
<descriptiveKeywords>
<MD_Keywords>
<keyword>
<gco:CharacterString>Agriculture</gco:CharacterString>
</keyword>
<keyword>
<gco:CharacterString>Biodiversity</gco:CharacterString>
</keyword>
<type>
<MD_KeywordTypeCode codeListValue="socialBenefitArea"/>
</type>
</MD_Keywords>
</descriptiveKeywords>
То, что я хочу, чтобы сцепить строки типа и ключевого слова, так что я получить список, который выглядит следующим образом:
theme:Atmospheric conditions
socialBenefitArea:Agriculture
socialBenefitArea:Biodiversity
Я попробовал следующие решения (XPath 1.0 или XPath 2.0 оба могут быть использованы), но всегда возвращается только первая тема «Атмосферные условия» первого совпадения.
for $n in /*/gmd:identificationInfo/*/gmd:descriptiveKeywords/gmd:MD_Keywords return string-join(($n/gmd:type/*/@codeListValue, ':', $n/gmd:keyword/*/text()), '')
/*/gmd:identificationInfo/*/gmd:descriptiveKeywords/gmd:MD_Keywords/gmd:keyword/concat(*/text(), ':', ../gmd:type/*/@codeListValue)
//gmd:descriptiveKeywords/*/string-join((gmd:type/*/@codeListValue, gmd:keyword/*/text()[1]), ':')
//gmd:descriptiveKeywords/*/gmd:keyword/concat(following-sibling::gmd:type/*/@codeListValue, ':', ./*/text())
Если XPaths выглядеть правильно, я делаю это в Java с Saxon-HE 9.x
.
Что я выяснил, так это то, что оценка возвращает String, а не NODESET, и мне, вероятно, нужно иметь несколько результатов. Какой XPath вернет NODESET?
Благодарим за помощь!