我有一个包含多行内容的元素,如下所示:
<root>
<parent>
<child>first line
second line
forth line
</child>
</parent>
</root>
我正在寻找一种只获得第二行的方法,如下:
second line
我尝试使用substring-before
和substring-after
的混合物来寻找\n
,但我什么都没得到。我的想法是使用substring-before(substring-after(child, '\n'), '\n')
。
当然,我只限于xPath 1.0
答案 0 :(得分:2)
我的想法是使用
substring-before(substring-after(child, '\n'), '\n')
。
如果当前上下文节点是parent
,则此方法是正确的(如果当前上下文是child
元素,则使用.
而不是child
)。但\n
可能不是表示换行符的正确方法。
XPath本身不支持\n
转义序列,但它也不认为控制字符在字符串文字中是特殊的,它会很乐意接受带引号的字符串中的文字换行符。所以问题是如何用你正在评估XPath表达式的宿主语言来表示换行符。如果您使用javax.xml.xpath
在Java中评估表达式,那么将需要使用\n
:
xpath.evaluate("substring-before(substring-after(child, '\n'), '\n')", parent);
但是在XSLT中(因为你标记了你的问题)你使用了一个XML字符引用,十进制或十六进制:
<xsl:value-of
select="substring-before(substring-after(child, ' '), ' ')" />
属性值中的文字换行符由XML解析器转换为空格,因此您无法执行
<xsl:value-of select="substring-before(substring-after(child, '
'), '
')" />
答案 1 :(得分:1)
尝试:
normalize-space(substring-before(substring-after(child, ' '), ' '))
这是假设行由换行符分隔。否则尝试回车(#13)或两者(CRLF)。