选择 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 不同于 unpack
和 processeqp
.
这将 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
元素的文本,该元素是祖先 unpack
、chkeqp
或 [= title
元素的 17=] 元素。
给定 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 不同于 unpack
和 processeqp
.
这将 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
元素的文本,该元素是祖先 unpack
、chkeqp
或 [= title
元素的 17=] 元素。