无法对元素中的多行内容进行子串

时间:2013-12-23 17:01:07

标签: xml xslt xpath xslt-1.0

我有一个包含多行内容的元素,如下所示:

<root>
    <parent>
        <child>first line
            second line

            forth line
        </child>
    </parent>
</root>

我正在寻找一种只获得第二行的方法,如下:

second line

我尝试使用substring-beforesubstring-after的混合物来寻找\n,但我什么都没得到。我的想法是使用substring-before(substring-after(child, '\n'), '\n')

当然,我只限于xPath 1.0

2 个答案:

答案 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, '&#10;'), '&#10;')" />

属性值中的文字换行符由XML解析器转换为空格,因此您无法执行

<xsl:value-of select="substring-before(substring-after(child, '
'), '
')" />

答案 1 :(得分:1)

尝试:

normalize-space(substring-before(substring-after(child, '&#10;'), '&#10;'))

这是假设行由换行符分隔。否则尝试回车(#13)或两者(CRLF)。