我有一个包含以下内容的xml文件:
<init-param>
<param-name>listings</param-name>
<param-value>true</param-value>
</init-param>
<init-param>
<param-name>showServerInfo</param-name>
<param-value>false</param-value>
</init-param>
我需要的是找到两行清单&true,然后用清单&false代替
我只想出
sed -i 's/^<param-name>listings<\/param-name>\n<param-value>true<\/param-value>$/<param-name>listings<\/param-name><param-value>false<\/param-value>/g' somefile.xml
感谢您的任何建议。
答案 0 :(得分:3)
对于输入文件:
$ more input.xml
<root>
<init-param>
<param-name>listings</param-name>
<param-value>true</param-value>
</init-param>
<init-param>
<param-name>showServerInfo</param-name>
<param-value>false</param-value>
</init-param>
</root>
您可以使用以下XSLT样式表:
$ more listing_conv.xslt
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes" />
<xsl:strip-space elements="*"/>
<xsl:template match="@* | node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()" />
</xsl:copy>
</xsl:template>
<xsl:template match="//init-param[./param-name = 'listings']/param-value">
<param-value>false</param-value>
</xsl:template>
</xsl:stylesheet>
说明:
<xsl:template match="@* | node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()" />
</xsl:copy>
</xsl:template>
这部分将复制XML文件中的所有内容(默认行为),除非您到达XPATH://init-param[./param-name = 'listings']/param-value
<xsl:template match="//init-param[./param-name = 'listings']/param-value">
<param-value>false</param-value>
</xsl:template>
第二部分将使您可以将param-value
的值更改为false。
因为XPATH将访问名称为init-param
的元素,这些元素具有名为param-name
的子元素,其值设置为listings
。对于这些元素,您可以访问名为param-value
的子元素并将其覆盖为false
。
输出:
$ xsltproc listing_conv.xslt input.xml
<?xml version="1.0"?>
<root>
<init-param>
<param-name>listings</param-name>
<param-value>false</param-value>
</init-param>
<init-param>
<param-name>showServerInfo</param-name>
<param-value>false</param-value>
</init-param>
</root>
我已经使用xsltproc
命令运行XSLT proc,但是您可以将其他命令用作xalan
,也可以仅下载saxon解析器jar:saxon9he.jar
并运行{{1} }
更多信息:
I need a simple command line program to transform XML using an XSL Stylesheet
答案 1 :(得分:0)
我找到了解决方案。我无法使用XSLT或其他。解决我的问题的方法很简单。您的答案确实非常有用,肯定比我的解决方案要好,但是我需要这种方式。
awk -i inplace '{
if ($0 ~ /globaltag/) {
r=1
}
if ($0 ~ /listings/) {
if (r==1) {
s=1
}
} else {
if($0 ~ /true/) {
if(s==1){
sub(/true/,"false");
s=0
r=0
}
} else {
s=0
}
}
print;
}' file.xml