我有以下的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()
由于
答案 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()
将获得恰好是文本节点的子节点。