Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/12.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
如何根据前面字符串中包含的内容,使用XPATH选择XML中未配对的标记?_Xml_Xpath - Fatal编程技术网

如何根据前面字符串中包含的内容,使用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

我绞尽脑汁想弄清楚如何使用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 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],'')结尾)]
基本上只是删除了规范化空间。