Scripting “选择并转换”XML转换语言?

Scripting “选择并转换”XML转换语言?,scripting,xslt,Scripting,Xslt,我希望以一次性命令和独立脚本的形式编写XML文档转换,就像我使用Unix工具(如grep、sed、awk等)处理文本文件一样。脚本必须可以在Linux和Windows之间移植,使用Cygwin是可以的 如果您已经定期这样做,您会使用什么解决方案?你能推荐一下吗 一些背景: 现在,我想从一组XML文档中删除某种元素。 我经常需要进行这种系统的XML文档重写; 有时,在飞行的命令行,我用了很多; 通常,我希望构建更复杂的转换,将它们保存到文件中,并从文件中执行它们 因此,我需要一种可以在命令行上使用

我希望以一次性命令和独立脚本的形式编写XML文档转换,就像我使用Unix工具(如grep、sed、awk等)处理文本文件一样。脚本必须可以在Linux和Windows之间移植,使用Cygwin是可以的

如果您已经定期这样做,您会使用什么解决方案?你能推荐一下吗

一些背景:

现在,我想从一组XML文档中删除某种元素。 我经常需要进行这种系统的XML文档重写; 有时,在飞行的命令行,我用了很多; 通常,我希望构建更复杂的转换,将它们保存到文件中,并从文件中执行它们

因此,我需要一种可以在命令行上使用的XML转换脚本语言。 类似于sed或awk for XML文档:它的命令将指定一个选择器来选择输入文档中的节点,再加上一个操作来指定在每个选定节点对文档执行的操作

通常,我会畏缩不前,用它编写Perl脚本。 这是可行的,但确实不符合要求:

语法上:代码过于冗长,无法在命令行中使用 语义上:没有给出“选择和转换”模式,我必须将这种行为显式地编程到我的代码中,因此读者不必要地难以理解这就是真正发生的事情 语法/语义:阅读或编写此代码需要语言的一般流利性 使用任何其他通用编程语言也可以这样说

这就是XSLT的发明目的,对吗

也许,但它确实也有同样的缺点

一个更好的匹配是:它真的很像sed,因为它支持我想要的类型的简短、神秘的命令。然而,与sed一样,由这些命令组成的大型程序很难理解

另一个想法是使用:

比XPath更强大的选择器 选择和操作相结合的优雅紧凑方式 内置可扩展性,具有任意JavaScript函数,但对于简单情况不需要太多JavaScript知识 很好,但我需要一个实用程序,它允许我将这些表达式用作独立脚本:

jqmanip --html '$(a:parent).detach()' foo.html > bar.html
jqmanip convert-tables-to-divs.jqm foo.html > bar.html

这就是我正在寻找的实用程序。

现在我正在使用/bin/sh和xmlstarlet的组合,例如


更新:我刚刚发现了另一种这样的语言:。
#!/bin/sh
#
# csproj2csproj - clean up VS 2010/2012 C# project files in various ways
#
# $Id$

dft='//*[local-name()="PropertyGroup" and not(@Condition)]'
dbg='//*[local-name()="PropertyGroup" and contains(*/@Condition,"Debug")]'
rel='//*[local-name()="PropertyGroup" and contains(*/@Condition,"Release")]'

RemoveTree()
{
  xmlstarlet ed -d "$1"
}

AppendAsLastChild()
{
  xmlstarlet ed -i "$1"'/*[last()]' -t elem -n "$2" -v "$3"
}

sed 's/encoding="utf-8"/encoding="Windows-1252"/' "$@" |
RemoveTree '//*[@Include="My Project\"]' |
RemoveTree '//*[not(@*|*) and not(normalize-space(.))]' |
RemoveTree '//*[local-name()="LangVersion"]' |
RemoveTree '//*[local-name()="CheckForOverFlowUnderFlow"]' |
RemoveTree '//*[local-name()="DocumentationFile"]' |
AppendAsLastChild "$dft" LangVersion ISO-2 |
AppendAsLastChild "$dbg" CheckForOverflowUnderflow true |
AppendAsLastChild "$rel" CheckForOverflowUnderflow false |
AppendAsLastChild "$rel" DocumentationFile 'bin\Release\vsdocs.xml'