我有一个XML文档,通过XSLT发送后,它在XML属性之前不再有换行符。比如说
two="b"
three="c">
five="e"/>
会变成
号
这当然是完全有效的XML,但更难读取,尤其是在有许多长属性值的情况下。据我所读,XSLT不能保留这些换行符,因为XSLT处理器不会传递这样不重要的信息。
所以,我现在要找的是一个基于命令行的漂亮打印机(在Linux中可用),它理想情况下只会更改文档,因为它在属性之间添加了换行符。不管它是否在第一个属性之前添加了一个,都与我无关,只要它更容易阅读。到目前为止我所做的尝试没有成功:
我正在使用输入文件
xmlint—格式
我同时尝试了xmllint --format test.xml和cat test.xml | xmllint --format -,结果相同:
。
因此,变化是:
XML衰退消失后的换行符
的压痕由4个空间减少到2个空间。
我不想要这些改变。这使用的是libxml版本20706。XML-PP-S
我试过none、nsgmls、nice、indented、record和record_c的样式。唯一接近的是nsgmls,它将添加换行符,但结果如下:
one="a"
two="b"
three="c"
>
four="d"
five="e"
/>
所以,没有压痕和奇怪的断线。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给了我:
encoding="UTF-8"?>
two="b"
three="c">
five="e"/>
。
所以,如果我能让它在新行中的那些属性基本上解决我的问题之前多缩进一些(我想)。
还有什么建议吗?
这个stackoverflow问题的最上面的答案符合您的要求吗?stackoverflow.com/questions/16090869/…
@Dwroelands不,xmllint没有添加那些换行符,我在这里问之前尝试过。
这个怎么样?pauldeden.com/2009/01/pretty-printing-xml-in-ubuntu-on.html
@据我所见,xml_pp只提供预定义的样式,这些样式都不会改变这一点。还是我错过了什么?
我同意@dwroelands的最初评论。我运行了猫file.xml | xmllint --format -,得到了你想要的。
@埃米利恩,真奇怪,我没有……我稍后再试,现在不在电脑旁。我相信它改变了其他的事情,比如删除空行,这是我不想要的。
@埃米伦,我又检查过了,但不适合我。有关详细信息,请检查编辑过的问题。
在任何常用的表示中,属性之间的空白不是XML数据模型的一部分。XML规范中没有任何要求将其传递给应用程序的内容。
@比奇克劳普同意了。这就是为什么我要寻找一个工具,在我的XSLT处理器解析文档之后,再添加它们。它们可能不在正确的位置,但是为每个新属性添加一个换行符应该足够近。
我忘了完成我的想法,因为上面概述的原因,你不太可能找到一个已经完成的工具。我认为您最好的选择是编写一个SAX或STAX输出器(或者更确切地说,采用一个存在的输出器并重写属性写入方法)。
@是的,这是一个解决方案。不过,我刚刚找到了一个使用现有工具的解决方案。
好吧,我找到了解决办法。我使用的工具称为HTML TyDy(实际上,我使用JTIDY,一个HTML TyDy的端口到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手册(或者在Linux系统上安装的手册页)中进行了解释,我最关心的是可以在其中设置缩进设置的中间块。
现在我可以使用命令java -jar jtidy-r938.jar -config tidy.config test.xml调用该工具,输出将
version="1.0"
encoding="UTF-8"?>
one="a"
two="b"
three="c">
four="d"
five="e" />
号
现在我很高兴。-)