关于xml:在属性之间添加换行符

Adding line breaks between attributes

我有一个XML文档,通过XSLT发送后,它在XML属性之前不再有换行符。比如说

1
2
3
4
5
6
<myoutertag one="a"
           two="b"
           three="c">
    <myinnertag four="d"
               five="e"/>
</myoutertag>

会变成

1
2
3
<myoutertag one="a" two="b" three="c">
    <myinnertag four="d" five="e"/>
</myoutertag>

这当然是完全有效的XML,但更难读取,尤其是在有许多长属性值的情况下。据我所读,XSLT不能保留这些换行符,因为XSLT处理器不会传递这样不重要的信息。

所以,我现在要找的是一个基于命令行的漂亮打印机(在Linux中可用),它理想情况下只会更改文档,因为它在属性之间添加了换行符。不管它是否在第一个属性之前添加了一个,都与我无关,只要它更容易阅读。

到目前为止我所做的尝试没有成功:

我正在使用输入文件

1
2
3
4
5
<?xml version="1.0" encoding="UTF-8"?>

<myoutertag one="a" two="b" three="c">
    <myinnertag four="d" five="e"/>
</myoutertag>

xmlint—格式

我同时尝试了xmllint --format test.xmlcat test.xml | xmllint --format -,结果相同:

1
2
3
4
<?xml version="1.0" encoding="UTF-8"?>
<myoutertag one="a" two="b" three="c">
  <myinnertag four="d" five="e"/>
</myoutertag>

因此,变化是:

  • XML衰退消失后的换行符
  • 的压痕由4个空间减少到2个空间。

我不想要这些改变。这使用的是libxml版本20706。

XML-PP-S

我试过nonensgmlsniceindentedrecordrecord_c的样式。唯一接近的是nsgmls,它将添加换行符,但结果如下:

1
2
3
4
5
6
7
8
9
<?xml version="1.0" encoding="UTF-8"?>
<myoutertag
one="a"
two="b"
three="c"
><myinnertag
four="d"
five="e"
/></myoutertag>

所以,没有压痕和奇怪的断线。

XMLStarlet

xmlstarter fo test.xml的输出与xmllint的输出相同。我还试图找到类似于xmlstarter -ed -P --insert"//@*" -t text -n"" -v"\
" test.xml
的东西,但这导致了glibc指针错误。我想这并不奇怪,因为我正试图在属性之间添加文本。

整齐的

这是我最近的一次。运行命令tidy -quiet -xml -indent -wrap 1 test.xml给了我:

1
2
3
4
5
6
7
8
9
<?xml version="1.0"
encoding="UTF-8"?>
<myoutertag one="a"
two="b"
three="c">

  <myinnertag four="d"
  five="e"/>
</myoutertag>

所以,如果我能让它在新行中的那些属性基本上解决我的问题之前多缩进一些(我想)。

还有什么建议吗?


好吧,我找到了解决办法。我使用的工具称为HTML TyDy(实际上,我使用JTIDY,一个HTML TyDy的端口到Java,因此是可移植的)。这个工具为配置提供了许多选项;我要找的那个叫做indent-attributes: true。实际上,我的整个配置文件是:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
add-xml-decl: true
drop-empty-paras: false
fix-backslash: false
fix-bad-comments: false
fix-uri: false
input-xml: true
join-styles: false
literal-attributes: true
lower-literals: false
output-xml: true
preserve-entities: true
quote-ampersand: false
quote-marks: false
quote-nbsp: false

indent: auto
indent-attributes: true
indent-spaces: 4
tab-size: 4
vertical-space: true
wrap: 150

char-encoding: utf8
input-encoding: utf8
newline: CRLF
output-encoding: utf8

quiet: true

这些选项的含义在Tidy手册(或者在Linux系统上安装的手册页)中进行了解释,我最关心的是可以在其中设置缩进设置的中间块。

现在我可以使用命令java -jar jtidy-r938.jar -config tidy.config test.xml调用该工具,输出将

1
2
3
4
5
6
7
8
9
10
11
<?xml
  version="1.0"
  encoding="UTF-8"?>
<myoutertag
 one="a"
 two="b"
 three="c">
    <myinnertag
     four="d"
     five="e" />
</myoutertag>

现在我很高兴。-)