Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby-on-rails-4/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Xml 多个元素(无需)的XPath,元素之间带有分隔符_Xml_Xpath - Fatal编程技术网

Xml 多个元素(无需)的XPath,元素之间带有分隔符

Xml 多个元素(无需)的XPath,元素之间带有分隔符,xml,xpath,Xml,Xpath,我正在处理一个xml文档,该文档旨在为数字图书馆记录的元素编制索引,并尝试使用两个非常不同的xml模式进行导航,我们希望以相同的方式对这两个模式进行索引(具体来说,是Dublin Core和MODS) 对于DC,我们的主题表达得非常简单: <dc:subject>Text string--text string--text string.</subject> 文本字符串--文本字符串--文本字符串。 然而,在MODS中,这更为复杂和具体,同样的信息表示为: <s

我正在处理一个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,因此我的选项有限。我想知道,是否有一种方法可以重写它,以返回由四个子元素和分隔符组成的字符串

如果只有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

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

此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)"