使用XPath从包含big-child的文本中获取文本并包含函数

时间:2015-09-11 11:47:14

标签: xml xslt xpath xslt-2.0 xpath-2.0

我有以下的XML。

<section level="sect1">
    <title>
      <page num="1150"/>
      <content-style font-style="bold">ORDER 62</content-style>
      <content-style format="smallcaps">Costs</content-style>
    </title>
</section>

我想在此检查title中是否包含ORDER字。

我试过

contains(//section[1]/title[1]/content-style[1]/text(),'ORDER')

但是有些情况下,字符串ORDER可能是第二个内容样式的,或者某些字符串可能是第三个。

请让我知道找到它的一般方法。

由于

4 个答案:

答案 0 :(得分:1)

contains(//section[1]/title[1]/content-style[1]/text(),'ORDER')

您在整个路径上执行contains,在此表达式中明确说明使用[1]获取每个元素的第一个元素。相反,根据您的描述,您希望其中包含“ORDER”的孩子content-style,您应该按照以下方式执行此操作:

//section[1]/title[1]/content-style[text() = 'ORDER']

或者,如果可以添加空格:

//section[1]/title[1]/content-style[normalize-space(text()) = 'ORDER']

如果结果非空,则您在content-style下面的任何title[1]中找到至少一个“订单”,低于section[1]

  

从祖父母元素中获取大孩子文字

这是你的问题标题。它与你写的略有不同。如果您想查看来自content-style任何曾孙section,请执行以下操作:

//section[1]/*/content-style[normalize-space(text()) = 'ORDER']

最后注意事项:您将原始问题标记为,在XSLT中,if条件不需要是布尔值,因此:

<xsl:if test="//section[1]/*/content-style[normalize-space(text()) = 'ORDER']">
    <hello>found it!</hello>
</xsl:if>

等于将整个事物包裹在contains中,除了使用contains,你将检查所有元素组合的字符串,这也是mach 'no such ORDER'< / em>,例如。

以上也类似于:

<!-- in place of xsl;if -->
<xsl:apply-templates select="//section[1]/*/content-style" />

<!-- place this at root level anywhere -->
<xsl:template match="content-style[normalize-space(text()) = 'ORDER']">
    <hello>found it!</hello>
</xsl:template>

<xsl:template match="content-style">
    <hello>Not an order!</hello>
</xsl:template>

答案 1 :(得分:1)

你想要

exists(//section[1]/title/content-style[contains(., 'ORDER')])

答案 2 :(得分:1)

  

我想在此检查title中是否包含ORDER字。

     

我已经尝试了

contains(//section[1]/title[1]/content-style[1]/text(),'ORDER')
     

但是有些情况下ORDER might be in 2nd 内容样式`或某些内容可能位于第3位。

     

请让我知道找到它的一般方法。

这是一个XPath 1.0表达式,它产生了所需的布尔值

boolean((//section)[1]/title[1][content-style[contains(., 'ORDER')]])

当至少有一个true()元素是content-style元素的子元素时,这恰好产生title,该元素是第一个section元素的第一个子元素XML文档。

以及相应的XPath 2.0表达式

exists((//section)[1]/title[1][content-style[contains(., 'ORDER')]])

答案 3 :(得分:0)

我认为您需要从&#34;标题&#34;下面获取所有文字。节点。以下应该有效:

contains(//section[1]/title[1]/string(.),'ORDER')

至少根据this reference