从shell中的XML访问属性

时间:2009-07-16 14:11:43

标签: xslt shell debian widget

我正在尝试使用shell从Widget config.xml中解析出值。我确实想用sed完成这项任务。如果有sucks less而不是xsltproc,我很想知道。

在此示例中,我位于以下config.xml id 属性值之后:

<?xml version="1.0" encoding="UTF-8"?>
<widget xmlns="http://www.w3.org/ns/widgets" id="http://example.org/exampleWidget" version="2.0 Beta" height="200" width="200">
<name short="123">Foo Widget</name>
</widget>

我希望它像Jquery's attr一样简单:var id = $("widget").attr("id");

目前使用xsltproc的shell代码失败了:

snag () {
TMP=$(tempfile)
cat << EOF > $TMP
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="text" encoding="utf-8" indent="no"/>
<xsl:template>
<xsl:value-of select="$1"/>
</xsl:template>
</xsl:stylesheet>
EOF

echo $(xsltproc $TMP config.xml)
rm -f $TMP
}

ID=$(snag "widget/@id")

if test "$ID" = "http://example.org/exampleWidget"
then
    echo Mission accomplished.
else
    echo "<$ID> is wrong."
fi

4 个答案:

答案 0 :(得分:1)

XMLStarlet(http://xmlstar.sourceforge.net/)是一个很好的命令行工具,支持这样的查询:

xmlstarlet sel -N w = namespace -T -t -m“/ w:widget / @ id”-v。 -n config.xml

答案 1 :(得分:0)

模板匹配=“小工具”

选择value-of =“@ id”

答案 2 :(得分:0)

&lt; xsl:template xmlns:wgt =“http://www.w3.org/ns/widgets”match =“/ wgt:widget”&gt; &lt; xsl:select value-of =“@ id”/&gt; &LT; / XSL:模板&GT;

答案 3 :(得分:0)

如果您没有进行转换,则不需要XSLT。 如果你只需要使用XPath获取值。

Perl的XML :: XPath模块附带了一个xpath程序。

来自shell: ID = $(xpath config.xml'string(/ widget / @ id)')

(string()函数只获取id的值。

/ widget / @ id本身返回“id = value”)

如果你只需要根据值产生一些其他输出,你可以 在xslt中完成所有操作。还有其他可用的XPath实现 其他脚本语言:我使用过来自rhino和Jython的Java的XPath。 还有来自Saxon命令行的XQuery。