Yes, there is a way to do it in XPath 1.0:
concat(
substring($s1, 1, number($condition) * string-length($s1)),
substring($s2, 1, number(not($condition)) * string-length($s2))
)
This relies on the concatenation of two mutually exclusive strings, the first one being empty if the condition is false (0 * string-length(...)
), the second one being empty if the condition is true. This is called "Becker's method", attributed to Oliver Becker (original link is now dead, the web archive has a copy).
In your case:
concat(
substring(
substring-before(//div[@id='head']/text(), ': '),
1,
number(
ends-with(//div[@id='head']/text(), ': ')
)
* string-length(substring-before(//div [@id='head']/text(), ': '))
),
substring(
//div[@id='head']/text(),
1,
number(not(
ends-with(//div[@id='head']/text(), ': ')
))
* string-length(//div[@id='head']/text())
)
)
Though I would try to get rid of all the "//"
before.
Also, there is the possibility that //div[@id='head']
returns more than one node.
Just be aware of that — using //div[@id='head'][1]
is more defensive.
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…