尝试匹配节点文本中的模式时抛出错误

时间:2014-06-12 08:36:15

标签: xslt

我有以下的XML行。

<para><content-style font-style="italic">Schedule 14.2</content-style></para>
<para><content-style font-style="bold">14.45 Schedule</content-style></para>

我试图使用下面的XSLT获得上面给出的第二个para的匹配。

    <xsl:when test="fn:contains(./content-style[1],'.') and fn:not(fn:contains(substring-before(./content-style[1]/text(),' '),text()))">

但是这里给我一个错误。错误是,

Wrong occurrence to match required sequence type -   Details: -     XPTY0004: The supplied sequence ('2' item(s)) has the wrong occurrence to match the sequence type xs:string ('zero or one')

我基本上想要匹配的是,

Check if there is a `.` in the `content-style` and 
then check if there is any text() preceding space before the number

我也想知道node()node()/text()之间以及self::node()./node() or child::node()

之间的区别

由于

1 个答案:

答案 0 :(得分:1)

现在,您已将XML显示为此..

<para><content-style font-style="italic">Schedule 14.2</content-style></para>
<para><content-style font-style="bold">14.45 Schedule</content-style></para>

或许看起来像这样:

<root>
    <para>
        <content-style font-style="italic">Schedule 14.2</content-style>
    </para>
    <para>
        <content-style font-style="bold">14.45 Schedule</content-style>
    </para>
</root>

你可能认为没有任何区别,但有。在第二个示例中,在每个下的内容样式元素之前和之后都有文本节点(包含空格)。这很重要,因为这是受影响的条件的一部分

not(contains(substring-before(./content-style[1]/text(),' '),text()))

你可以更好地看到它,如果你简化它(仅作为例如),因为在这种情况下substring-before不是问题

 <xsl:value-of select="not(contains('Schedule',text()))" />

此处,text()获取当前节点下的“文本”节点。在这种情况下,在 para 元素下。它不检查字符串是否包含文本,而是检查字符串是否包含文本节点的值。但是你有两个文本节点,因此错误。

我无法完全遵循你想要的逻辑,但也许你想检查空格前的位是否为数字。在这种情况下,你会这样做(检查它是否是文本,而不是数字)

 <xsl:value-of select="string(number('Schedule')) = 'NaN'" />

或者,使用子串 - 放回之前,使其与 para 元素相关

 <xsl:value-of select="string(number(substring-before(./content-style[1]/text(),' '))) = 'NaN'" />

请记住,text()node()等表达式与当前节点相关。仅self::node()等同于.的{​​{1}}将获取当前节点,但./node()child::node()(或仅node())将获得子节点。

执行text()将获得恰好是文本节点的子节点。