将 XML 文件转换为可由 VCS 人工编辑和管理的文件
有时 XML 文件需要存储在某些 VCS 中。此类文件通常使用 GUI 工具进行编辑,这些工具可以根据需要每次对元素重新排序。
此外,VCS 合并通常是面向行的,并且通常 XML 文件要么看起来像一长行,要么像 那样完全缩进
<foo>
<bar>
<name>
n3
</name>
<value>
qqq3
</value>
</bar>
<bar>
<name>
n2
</name>
<value>
qqq2
</value>
</bar>
</foo>
,而它们应该看起来像
<foo>
<bar> <name> n2 </name> <value> qqq2 </value> </bar>
<bar> <name> n3 </name> <value> qqq3 </value> </bar>
</foo>
(例如“部分缩进”)以便更易于人类阅读/编辑、紧凑。一个简单的逻辑单元应该占据一行。
即使有人将 XML 文件转换为如此好的格式,其他人也会在 GUI 工具中对其进行编辑,该工具将重新排序并重新意图所有内容,这将是很糟糕的(不可读,VCS 将报告大量更改,尽管几乎没有实际更改)。
是否有现成的 XSLT 转换(或其他程序)将所有 XML 文件转换为某种统一格式(例如排序(如果元素顺序不重要)并统一空格)以及我可以在哪里指定哪些元素应该是 oneliners?
例如,如果我可以在 .gitattributes
中指定过滤器这样的转换,那么 git 会自动处理这个问题。
Sometimes XML files needs to be stored in some VCS. Such files are often edited using GUI tools which can reorder the elements each times as they want.
Also VCS merging is usually line-oriented, and often XML files either looks likes one long line or fully indented like
<foo>
<bar>
<name>
n3
</name>
<value>
qqq3
</value>
</bar>
<bar>
<name>
n2
</name>
<value>
qqq2
</value>
</bar>
</foo>
, while they should look like
<foo>
<bar> <name> n2 </name> <value> qqq2 </value> </bar>
<bar> <name> n3 </name> <value> qqq3 </value> </bar>
</foo>
(e.g. "partially indented") to be more human readable/editable, compact. One simple logical unit should occupy one line.
Even if somebody converts XML file to such nice format, someone else will edit it in GUI tool that will reorder and reintent everything and it will be bad (unreadable and VCS will report massive changes despite of there are almost no actual changes).
Is there ready made XSLT transformation (or other program) that converts all XML files to some unified format (e.g. sorts (if element order do not matter) and unifies whitespace) and where I can specify which elements should be oneliners?
For example, if I can specify such transformation as filter in .gitattributes
and git will automatically handle this.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
我没有在每个 XSLT 处理器中进行测试(事实上,我只在 MSXSL 中进行了测试):
结果:
注意:XML 序列化可能会有所不同。如果是这种情况,请保留逻辑并序列化为 TEXT(您必须通过输出开始和结束标记以及属性来模拟 XML 序列化)
编辑:进行较小的更改,以便正确对不同的序列化输入进行排序。
I did not test in every XSLT processor (In fact, I only tested this in MSXSL):
Result:
Note: XML serialization may vary. If this is the case, preserve the logic and serialize as TEXT (You must simulate XML serialization by output opening and closing tags as well as attributes)
Edit: Minor change in order to properly sort diferent serializated input.
是的,有 XML 漂亮的打印机;我自己总是使用 xmllint 。
Yes, there are XML prettyprinters; I always use xmllint myself.
基于 http://www.dpawson.co 创建了我自己的排序缩进器。 uk/xsl/sect2/pretty.html 和 Alejandro 的答案:http://vi -server.org/vi/sortindent.xsl。镜像如下:
现在,原始 XML 文件的“等效”转换(属性的重新排序除外)映射到相同的结果 XML,并且格式良好,并且我可以强制某些元素成为单行元素。
Created my own sort-indenter based on http://www.dpawson.co.uk/xsl/sect2/pretty.html and Alejandro's answer: http://vi-server.org/vi/sortindent.xsl. Mirrored here:
Now "equivalent" transformations of the original XML file (except of reordering of attributes) maps to the same resulting XML, and it is fine formatted, and I can force some elements to be oneliners.