我有一个XML文档,在通过我的XSLT发送之后,XML属性之前不再有换行符。例如,
<myoutertag one="a"
two="b"
three="c">
<myinnertag four="d"
five="e"/>
</myoutertag>
会变成
<myoutertag one="a" two="b" three="c">
<myinnertag four="d" five="e"/>
</myoutertag>
这当然是完全有效的XML,但它更难以阅读,特别是如果有很多长属性值。根据我的阅读,XSLT无法保留这些换行符,因为XSLT处理器未传递此类不重要的信息。
因此,我现在正在寻找的是基于命令行的漂亮打印机(可在Linux中使用),理想情况下,它只会更改文档,因为它会在属性之间添加换行符。是否在第一个属性之前添加一个属性与我几乎无关,只要它更容易阅读。
我正在使用输入文件
<?xml version="1.0" encoding="UTF-8"?>
<myoutertag one="a" two="b" three="c">
<myinnertag four="d" five="e"/>
</myoutertag>
我尝试了xmllint --format test.xml
和cat test.xml | xmllint --format -
两个相同的结果:
<?xml version="1.0" encoding="UTF-8"?>
<myoutertag one="a" two="b" three="c">
<myinnertag four="d" five="e"/>
</myoutertag>
所以,改变是:
<myinnertag>
的缩进从四个空格减少到两个空格我不想要那些改变。这是使用libxml版本20706。
我尝试了样式none
,nsgmls
,nice
,indented
,record
和record_c
。唯一接近的是nsgmls
,它会添加换行符,但结果如下:
<?xml version="1.0" encoding="UTF-8"?>
<myoutertag
one="a"
two="b"
three="c"
><myinnertag
four="d"
five="e"
/></myoutertag>
所以,没有缩进和奇怪的断线。
xmlstarter fo test.xml
的输出与xmllint
的输出相同。我也尝试过像xmlstarter -ed -P --insert "//@*" -t text -n "" -v "\\n" test.xml
这样的东西但是导致glibc指针错误。我想这并不奇怪,因为我试图在属性之间添加文本。
这是我到目前为止最接近的。运行命令tidy -quiet -xml -indent -wrap 1 test.xml
会给我:
<?xml version="1.0"
encoding="UTF-8"?>
<myoutertag one="a"
two="b"
three="c">
<myinnertag four="d"
five="e"/>
</myoutertag>
所以,如果我能够在新行中的那些属性之前更多地缩进,这基本上可以解决我的问题(我认为)。
还有其他建议吗?
答案 0 :(得分:4)
好的,我找到了解决方案。我使用的工具称为HTML Tidy(实际上,我使用了jTidy,这是一个HTML Tidy to Java的端口,因此是可移植的)。该工具提供了许多配置选项;我正在寻找的是indent-attributes: true
。实际上,我的整个配置文件是:
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 manual(或手册页,如果你在Linux系统上安装)中进行了解释,我主要关心那个我可以设置缩进设置的中间块。
我现在可以使用命令java -jar jtidy-r938.jar -config tidy.config test.xml
调用该工具,输出将是
<?xml
version="1.0"
encoding="UTF-8"?>
<myoutertag
one="a"
two="b"
three="c">
<myinnertag
four="d"
five="e" />
</myoutertag>
现在我很高兴。 : - )