7

我有以下文件log.xml

<entry>
  <message>Line 1
  Line 2 and so on</message>
</entry>

在使用 xmlstarlet 1.0.1 的 CentOS 5.4 上,如果我运行以下命令,同时删除换行符message

xml sel -t -m //entry -v "translate(message,'&#xa;' ,'@')" log.xml

结果是:

Line 1@  Line 2 and so on

在使用 xmlstarlet 的 CentOS 6 上:

1.3.1
compiled against libxml2 2.7.6, linked with 20706
compiled against libxslt 1.1.26, linked with 10126

我会收到:

Line 1
  Line 2 nd so on

注意“和”转换为空。我想这不是 xmlstarlet 的问题,而是 libxslt 的一些变化。

任何想法如何解决它?

更新

添加了将字母“a”转换为空的问题。

4

3 回答 3

6

您可以通过定义包含换行符值的变量以一般方式解决此问题:

--var linebreak -n --break 

然后将该变量用作 translate 函数的第二个参数:

xml sel -t -m //entry
        --var linebreak -n --break
        -v "translate(message, \$linebreak ,'@')"
        log.xml
于 2013-02-21T11:12:29.627 回答
3

&#xa;仅当 XPath 表达式本身位于 XML 文件(例如 XSLT 样式表)中时,才表示换行符。我怀疑这里发生的事情是当你说

translate(message,'&#xa;' ,'@')

在命令行上, the'&#xa;'被视为一个五个字符的字符串,因此您要translate替换&@并替换所有#,x和什么a;没有。

尝试使用 ctrl-V 换行

xml sel -t -m //entry -v "translate(message,'<ctrl-V><CR>' ,'@')" log.xml

(即在键入命令时按 ctrl-V 后跟回车 - 它会在屏幕上显示为^M)。

于 2013-02-21T10:40:33.267 回答
2

我不知道 xmlstarlet,但你可以试试Xidel

xidel log.xml -e '//message/translate(., $line-ending, "@")'

我编写了从解析器到查询引擎的所有内容,因此它没有依赖关系并且在所有系统上的行为都相同。

于 2013-02-21T10:07:10.153 回答