多个元素的XPath(不需要),之间使用分隔符

时间:2018-08-01 17:55:27

标签: xml xpath

我正在使用一个XML文档,该文档旨在为数字图书馆记录的元素建立索引,并尝试使用我们希望以相同方式建立索引的两个非常不同的xml模式进行导航(具体来说,是Dublin Core和MODS。)

对于DC,我们的主题表达非常简单:

<dc:subject>Text string--text string--text string.</subject>

但是,在MODS中,这更加复杂和具体,其信息表示为:

<subject authority="lcsh">
    <name type="corporate">
        <namePart>Text string</namePart>
    </name>
    <titleInfo>
        <title></title>
    </titleInfo>
    <topic>Text string</topic>
    <genre>Text string</genre>
</subject>                        <!-- Added by edit -->

并非所有主题的子元素都会同时出现。当我让它们显示以使它们在用户界面中看起来相同时,我对如何在自定义索引器中处理该问题感到有些困惑。

该索引专门从给定的xpath中提取。在DC中,这很好用,因为所有内容都已包含在一个元素中:

<term indexName="subject" displayName="Subject" xpath="//dc:subject"/>

但是,在MODS中,这更为复杂。我了解我可以使用|在不同元素之间返回所有元素,但由于缺少-分隔符,因此仍与dc:subject中的数据不匹配。

我无法控制索引器(专有)的架构文档,并且我不能使用xslt,因此我的选择受到限制。我想知道,有没有办法我可以重写它以返回由四个子元素和一个分隔符组成的字符串?

2 个答案:

答案 0 :(得分:0)

如果只有XPath-1.0可用并且可以包含空白部分,则可能适合以下XPath表达式:

concat(name/namePart/text(),' -- ',titleInfo/title/text(),' -- ',topic/text(),' -- ',genre/text())

其结果是

Text string --  -- Text string -- Text string

借助XPath-2.0,您可以使用条件表达式来避免空节:

concat(
    if (normalize-space(name/namePart/text())) then 
        concat(name/namePart/text(),' -- ') 
    else '', 
    if (normalize-space(titleInfo/title/text())) then 
        concat(titleInfo/title/text(),' -- ' )
    else '', 
    if (normalize-space(topic/text())) then 
        concat(topic/text(),' -- ') 
    else '', 
    if (normalize-space(genre/text())) then 
        genre/text() 
    else ''
)

其输出为

Text string -- Text string -- Text string

这不是一个完美的解决方案,但足以适应您的特定情况。

答案 1 :(得分:0)

这个xpath表达式对我有用:

xpath="concat(subject/name/namePart, substring(' -- ',1,number(subject/name/namePart!='')*4) , subject/titleInfo/title, substring(' -- ',1,number(subject/titleInfo/title!='')*4), subject/topic, substring(' -- ',1,number(subject/topic!='')*4), subject/genre)"