如何根据前面字符串中包含的内容,使用XPATH选择XML中未配对的标记?
我绞尽脑汁想弄清楚如何使用XPATH选择XML中的以下换行标记如何根据前面字符串中包含的内容,使用XPATH选择XML中未配对的标记?,xml,xpath,Xml,Xpath,我绞尽脑汁想弄清楚如何使用XPATH选择XML中的以下换行标记 <?xml version="1.0" encoding="utf-8"?> <Structure> <Branch> <content> <par> Line 1: This is some text with a space after the period. <linebreak/> Line 2: This is some t
<?xml version="1.0" encoding="utf-8"?>
<Structure>
<Branch>
<content>
<par>
Line 1: This is some text with a space after the period. <linebreak/>
Line 2: This is some text with no space after the period.<linebreak/>
Line 3: This text doesn't end in a period and must also be handled differently<linebreak/>
Line 4: This text doesn't matter.
</par>
</content>
</Branch>
</Structure>
第1行:这是一些在句点后带有空格的文本。
第2行:这是句点后没有空格的文本。
第3行:这篇文章不是以句号结尾,也必须以不同的方式处理
第4行:这篇文章无关紧要。
我需要的是XPATH语句,它将根据前面字符串中的内容(句点和无空格、句点和空格或无句点和无空格)选择换行标记
基本上,我需要在翻译软件中以不同的方式处理这些标签。我尝试过类似于/*[以(,,'.')]/以下兄弟姐妹::linebreak[position()<3]
和//par[以(text(),'.')]结尾]/linebreak
的方法,但不幸的是,我不知道这些方法的有效性。我将非常感谢您在查找与第1-3行匹配的XPath时提供的帮助
(请注意,上面的XML表示法只是为了良好的可读性;假设所有内容都在一行上。)获取
第一行
//Structure/Branch/content/par/linebreak[1]/preceding-sibling::text()[1]
要匹配前两个
s,可以使用以下XPath-2.0表达式
//content/par/linebreak[ends-with(normalize-space(preceding::text()[1]),'.')]
这与前两个匹配。
要以不同方式处理第三个谓词,可以对谓词求反
//content/par/linebreak[not(ends-with(preceding::text()[1],'.')) and not(ends-with(preceding::text()[1],' '))]
你也可以用DeMorgan来简化它
//content/par/linebreak[not(ends-with(preceding::text()[1],'.') or ends-with(preceding::text()[1],' '))]/preceding::text()[1]
结果是一样的,第三个
要检查前面的字符串是否以点后跟空格结尾,请执行以下操作
//content/par/linebreak[ends-with(preceding::text()[1],'. ')]
所以您只需要提取第1行到第3行?是的,我需要实际选择换行符标记,但需要单独选择(换行符终止第1行需要一个Xpath,换行符终止第2行需要一个Xpath,换行符终止第3行需要一个Xpath)?为什么不使用索引?你能提供一个这样做的例子吗?我不熟悉这一点。请看下面的答案,现在我明白你的意思了。这可能在这个具体的案例中起作用,但这些只是例句。换行符将随机出现在XML文件中,有些带有句点(和空格),有些不带句点。已测试并按指定工作!:D第1行和第2行是否有任何方法来进行最终区分-在句点之后但在第1行的换行符标记之前有一个空格?您的意思是它以结束吗代码>?是的。我认为这是可行的:第1行://content/par/linebreak[以(preference::text()[1],'..')结尾]
第2行://content/par/linebreak[以(preference::text()[1],'.')结尾]
第3行://content/par linebreak[不是(以(preference::text()[1],'.'))结尾)和不是(以(preference::text()[1],'')结尾)]
基本上只是删除了规范化空间。