选择 text() 使用 ancestor-or-self 和多个表达式 XSLT XPATH

selecting text() using ancestor-or-self with multiple expressions XSLT XPATH

给定 XML:

<surmat>
  <unpack>
     <proc>
        <para>SERVICE UPON RECEIPT</para>
     </proc>
     <proc>
         <title></title>
         <para>Lift and remove</para>
     </proc>
   </unpack>
<surmat>

<surmat> 有三个 children unpack | chkeqp | processeqp 所以 xml 也可以是

<surmat>
  <processeqp>
     <proc>
        <para>SERVICE UPON RECEIPT</para>
     </proc>
     <proc>
         <title></title>
         <para>Lift and remove</para>
     </proc>
   </processeqp>
<surmat>

<surmat>
      <chkeqp>
         <title>SERVICE UPON RECEIPT</title>
         <proc>
             <title></title>
             <para>Lift and remove</para>
         </proc>
       </chkeqp>
    <surmat>

使用 XPATH 或 XSLT 2.0 我只想检查 SERVICE UPON RECEIPT<unpack><chkeqp><processeqp> 的第一个 child 中是否存在来自 <title> 模板和 <unpack/chkeqp/processeqp> 模板,因为 <title> 是可选的。 (我必须插入 SERVICE... and/or 标题标签,如果其中任何一个丢失。) chkeqp 的 children 不同于 unpackprocesseqp .

这将 return true 如预期的那样:

contains(upper-case(ancestor-or-self::*[unpack or chkeqp or processeqp]),'SERVICE UPON RECEIPT')

但我只需要检查第一个 child,我无法使用 text() 找出语法。

即这没有用:

contains(upper-case(ancestor-or-self::*[unpack or chkeqp or processeqp]/text()[1]),'SERVICE UPON RECEIPT')

或其变体:

contains(upper-case(ancestor-or-self::*[unpack or chkeqp or processeqp]/proc/para/text()[1]),'SERVICE UPON RECEIPT')

如果有更有效的方法,非常感谢您分享!谢谢。

这个答案解决了我的问题:

contains(upper-case(ancestor-or-self::*[(self::unpack or self::chkeqp or self::processeqp) and count(preceding-sibling::*[self::unpack or self::chkeqp or self::processeqp])=0]/descendant-or-self::para[1]),'SERVICE UPON RECEIPT')

我不确定我是否正确理解了你的问题,但考虑到你的 xml,以下 xpath

contains(upper-case(//ancestor-or-self::*[name()=('unpack','chkeqp', 'processeqp')]/*[1]//para/text()),'SERVICE UPON RECEIPT')

returns

true

这就是你想要的吗?

要检查祖先元素是否是 surmat 的第一个子元素,您可以计算 preceding-sibling 个:

contains(upper-case(ancestor-or-self::*[(self::unpack or self::chkeqp or self::processeqp) and count(preceding-sibling::*[self::unpack or self::chkeqp or self::processeqp])=0]/descendant-or-self::para[1]),'SERVICE UPON RECEIPT')

此表达式仅 returns true 用于匹配第一个 para 元素的文本,该元素是祖先 unpackchkeqp 或 [= title 元素的 17=] 元素。