尝试在 eXist-db 中提取 TEI xml 时未获取文本节点
Not getting text nodes while trying to extract TEI xml in 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>
};
知道为什么会这样吗?
您的根元素 <TEI
位于具有 uri 的名称空间中:“http://www.tei-c.org/ns/1.0”,因此您的 div 在这种情况下也在该名称空间中。
请参阅 了解如何将 exist-db 与命名空间一起使用
TEI 词汇表中的元素都来自 XML 命名空间,如 xmlns
属性所示 - 用于声明 XML 命名空间绑定的保留属性:
<TEI xmlns="http://www.tei-c.org/ns/1.0">
XML-aware 应用程序(例如 eXist-db)具有用于查询命名空间 XML 的各种工具。在 XQuery 中最常见的是,您将在查询的序言中添加“名称空间声明”,它将名称空间 URI 绑定到名称空间前缀:
declare namespace tei="http://www.tei-c.org/ns/1.0";
然后您可以在查询中使用 tei
命名空间前缀:
//tei:div[@type="original"]/tei:ab
当您删除 <TEI>
根元素时,您还删除了内部元素上的名称空间绑定。它们似乎存在于“空”命名空间——默认元素命名空间中。这就是为什么您的查询在这种情况下无需指定名称空间就可以工作的原因。
我有一个 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>
};
知道为什么会这样吗?
您的根元素 <TEI
位于具有 uri 的名称空间中:“http://www.tei-c.org/ns/1.0”,因此您的 div 在这种情况下也在该名称空间中。
请参阅
TEI 词汇表中的元素都来自 XML 命名空间,如 xmlns
属性所示 - 用于声明 XML 命名空间绑定的保留属性:
<TEI xmlns="http://www.tei-c.org/ns/1.0">
XML-aware 应用程序(例如 eXist-db)具有用于查询命名空间 XML 的各种工具。在 XQuery 中最常见的是,您将在查询的序言中添加“名称空间声明”,它将名称空间 URI 绑定到名称空间前缀:
declare namespace tei="http://www.tei-c.org/ns/1.0";
然后您可以在查询中使用 tei
命名空间前缀:
//tei:div[@type="original"]/tei:ab
当您删除 <TEI>
根元素时,您还删除了内部元素上的名称空间绑定。它们似乎存在于“空”命名空间——默认元素命名空间中。这就是为什么您的查询在这种情况下无需指定名称空间就可以工作的原因。