首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >如果文档BaseX中的文本匹配,则用元素替换文本节点

如果文档BaseX中的文本匹配,则用元素替换文本节点
EN

Stack Overflow用户
提问于 2022-02-28 13:56:43
回答 1查看 153关注 0票数 0

如果文档与文本匹配,则尝试用元素替换文本节点,在下面的查询中,我尝试过,但它给出的错误"Target不是元素,文本、属性、注释或pi“是我的查询。

inputXML:

代码语言:javascript
代码运行次数:0
运行
复制
<book>
<p>Isn't it lovely here? Very smart. We'll be like three queens when you've finished with us,
    Edie. You doing well then?</p>
<p>
    <name type="person">April De Angelis</name>’ plays include <title type="work">Positive
        Hour</title> (Out of Joint) <title type="work">Playhouse Creatures</title> (<name
        type="org">Sphinx Theatre Company</name>), <title type="work">Hush</title> (<name
        type="org">Royal Court</name>), <title type="work">Soft Vengeance</title>, <title
        type="work">The Life and Times of Fanny Hill</title> (adapted from the <name type="org"
        >John Cleland novel</name>) and <title type="work">Ironmistress</title>. Her work for
    radio includes <title>The Outlander</title> (<name type="org">Radio 5</name>), which won the
        <name type="org">Writers’ Guild Award</name> (<date>1992</date>), and, for opera, <title
        type="work">Flight</title> with composer <name type="person">Jonathan Dove</name> (<name
        type="place">Glyndebourne</name>, <date>1998</date>).</p>
 </book>

预期产出:

代码语言:javascript
代码运行次数:0
运行
复制
<book>
<p>Isn't it lovely here? Very smart. We'll be like three <highlight>>queens</highlight> when
    you've finished with us, Edie. You doing well then?</p>
<p>
    <name type="person">April De Angelis</name>’ plays <highlight>include</highlight>
    <title type="work">Positive Hour</title> (Out of Joint) <title type="work">Playhouse
        Creatures</title> (<name type="org">Sphinx Theatre Company</name>), <title type="work"
        >Hush</title> (<name type="org">Royal Court</name>), <title type="work">Soft
        Vengeance</title>, <title type="work">The Life and Times of Fanny Hill</title> (adapted
    from the <name type="org">John Cleland novel</name>) and <title type="work"
        >Ironmistress</title>. Her work for radio includes <title>The Outlander</title> (<name
        type="org">Radio 5</name>), which won the <name type="org">Writers’ Guild Award</name>
        (<date>1992</date>), and, for opera, <title type="work">Flight</title> with composer
        <name type="person">Jonathan Dove</name> (<name type="place">Glyndebourne</name>,
        <date>1998</date>).</p>
</book>

我使用的是BaseX版本9.5.1,下面是代码。

代码语言:javascript
代码运行次数:0
运行
复制
let $body := <indexedterms>
        <content>
            <terms>
                <term>include</term>
                <term>Queens</term>
            </terms>
            <uri>/IEEE/IEEE/test.xml</uri>
        </content>
     </indexedterms>

for $contents in $body/content
let $uri := $contents/uri
let $doc := fn:doc($uri)
for $selectedterm in $contents/terms/term/string()
let $Modifieddoc := copy $c := $doc
                    modify
                       (
                          for $nodes in $c//*//text()[fn:matches(.,$selectedterm)]/parent::*
                          return
                          if($nodes/node()[fn:matches(.,$selectedterm)]/parent::*:highlight)
                          then ()
                          else
                          replace node  $nodes/$selectedterm with <highlight>{$selectedterm}</highlight>
                       )
                   return $c
return                       
db:replace('IEEE',substring-after($uri,'/IEEE'),$Modifieddoc)                

以前,我使用的是“替换节点$节点/节点()fn:$selectedterm(.,$selectedterm})”,而不是“用{$selectedterm}替换节点$节点/$selectedterm”--它是在做一些工作,但是在诸如蒸汽这样的术语(包括,包含)中,它匹配了这两个不正确的单词,因此我将代码更改为“替换节点”$节点/用{$selectedterm}选择术语“”。

EN

回答 1

Stack Overflow用户

发布于 2022-03-02 07:43:53

$nodes/$selectedterm可能是罪魁祸首,而且很可能不是您想要的,因为$selectedterm变量是一个字符串值序列(绑定for $selectedterm in $contents/terms/term/string())。如果您向我们展示了使用doc函数加载的示例文档,以及您希望使用BaseX对其进行的更新,那么它可能会帮助我们理解您想要实现的目标,例如,您在代码片段中显示的两个示例term

在XSLT 3或3中可以很好地完成在文本内容中识别和包装搜索项的任务,如果将Saxon9.9或10或11放在类路径上,可以使用BaseX运行这些任务:

代码语言:javascript
代码运行次数:0
运行
复制
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  version="3.0"
  xmlns:xs="http://www.w3.org/2001/XMLSchema"
  xmlns:fn="http://www.w3.org/2005/xpath-functions"
  exclude-result-prefixes="#all"
  expand-text="yes">
  
  <xsl:param name="terms" as="xs:string*" select="'include', 'Queens'"/>

  <xsl:output method="xml" indent="no"/>
  
  <xsl:template match="p//text()">
    <xsl:apply-templates select="analyze-string(., string-join($terms, '|'), 'i')/node()"/>
  </xsl:template>
  
  <xsl:template match="fn:match">
    <highlight>{.}</highlight>
  </xsl:template>
  
  <xsl:template match="fn:non-match">
    <xsl:apply-templates/>
  </xsl:template>

  <xsl:mode on-no-match="shallow-copy"/>

</xsl:stylesheet>

由于使用的analyze-string函数也存在于BaseX/XQuery中,所以您还应该能够对调用该函数的结果使用XQuery更新,即将fn:match元素替换为highlight元素。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71296095

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档