尝试在 eXist-db 中提取 TEI xml 时未获取文本节点

时间:2021-06-30 13:26:31

标签: xml xquery exist-db

我有一个 XML 文件,想提取 HTML 中的文本,但是我提取时它是空的。我试图从标签中获取文本,当我删除 XML 代码的开头并用标签启动文件时,它工作得很好。 这是 XML 文件的开头:

<TEI xmlns="http://www.tei-c.org/ns/1.0" xmlns:vg="http://www.vangoghletters.org/ns/">
    <teiHeader xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
        <fileDesc>
            <titleStmt>
                <title>book title</title>
            </titleStmt>
            <publicationStmt>
                <publisher>
                    <name> name of the publisher </name>
                </publisher>
                <date type="first" when="2021">2021</date>
                <availability status="restricted">
                    <licence target="http://creativecommons.org/licenses/by-nc-sa/4.0/ https://creativecommons.org/licenses/by-nc-sa/4.0/legalcode">
                        <p>Attribution-NonCommercial-ShareAlike 4.0 International (CC BY-NC-SA 4.0) </p>
                    </licence>
                </availability>
                <ptr target="http://vangoghletters.org/orig/let001"/>
            </publicationStmt>
            <sourceDesc>
                <vg:letDesc>
                    <vg:letIdentifier>
                        <idno type="jlb">001</idno>
                        <idno type="collectedletters">1</idno>
                        <idno type="brieven1990">001</idno>
                    </vg:letIdentifier>

                    <vg:letContents>
                        <p>book name, chapter</p>
                    </vg:letContents>
                    <note type="sourceStatus" xml:id="sourceStatus">
                        <p> handwriting </p>
                    </note>
                    <note type="additionalDetail" xml:id="additionalDetail">
                        <p> some text</p>
                    </note>
                </vg:letDesc>
            </sourceDesc>
        </fileDesc>
    </teiHeader>
    
    <text xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
        <body>
            <div type="original" xml:lang="ka">
            
                <pb f="1r" n="1" xml:id="pb-orig-1r-1" facs="#zone-pb-1r-1"/>
                <lb n="2" xml:id="l-1"/>
                <ab>There <rs type="pers" key="320"><supplied reason="lost">ეს</supplied>[7125.1]არისთა</rs>,
                    <rs type="pers" key="1643">მეფისა </rs>
                    
                    <rs type="pers" key="838">ასუ<supplied reason="lost">რასტა</supplied>ნისათა</rs>,
                    ...

这是我的 XQuery 代码:

declare function app:text_orig($node as node(), $model as map(*))
{
    for $resource in collection('/db/apps/oshki/data')
        for $i in $resource//div[@type="original"]/ab//text()
            return
            <p>  {$i} </p>
};

知道为什么会这样吗?

2 个答案:

答案 0 :(得分:0)

您的根元素 <TEI 位于具有 uri 的命名空间中:“http://www.tei-c.org/ns/1.0”,因此在这种情况下,您的 div 也在该命名空间中。 参见 this answer 以了解如何使用带有命名空间的exist-db

答案 1 :(得分:0)

TEI 词汇表中的元素都来自一个 XML 命名空间,如 xmlns 属性所示 - 一个用于声明 XML 命名空间绑定的保留属性:

<TEI xmlns="http://www.tei-c.org/ns/1.0">

诸如 eXist-db 之类的 XML 感知应用程序具有用于查询命名空间 XML 的各种工具。在 XQuery 中,最常见的是将“命名空间声明”添加到查询的序言中,它将命名空间 URI 绑定到命名空间前缀:

declare namespace tei="http://www.tei-c.org/ns/1.0";

然后您可以在查询中使用 tei 命名空间前缀:

//tei:div[@type="original"]/tei:ab

当您删除 <TEI> 根元素时,您还剥离了内部元素上的命名空间绑定。它们似乎存在于“空”命名空间中——默认元素命名空间。这就是为什么您的查询在这种情况下无需指定命名空间即可工作的原因。

相关问题