我有一个多行内容的元素,如下所示:
<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
我的想法是使用
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, '
'), '
')" />
尝试:
normalize-space(substring-before(substring-after(child, ' '), ' '))
这是假设行由换行符分隔。否则,请尝试回车(#13)或同时回车(CRLF)。