1

我正在尝试使用 shell从 Widget config.xml中解析出值。我确实想使用 sed 来完成这项任务。如果有什么东西比 xsltproc更糟糕,我很想知道。

在这个例子中,我在下面的id属性值之后config.xml

<?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 的 attr一样简单:var id = $("widget").attr("id");

目前这个shell代码使用xsltproc失败:

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

4 回答 4

1

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

xmlstarlet sel -N w=namespace -T -t -m "/w:widget/@id" -v 。-n 配置.xml

于 2009-07-16T15:50:59.913 回答
0

模板匹配="小部件"

选择价值=“@id”

于 2009-07-16T14:54:41.307 回答
0

<xsl:template xmlns:wgt="http://www.w3.org/ns/widgets" match="/wgt:widget"> <xsl:select value-of="@id" /> </xsl:模板>

于 2009-07-16T15:44:42.813 回答
0

如果不进行转换,则不需要 XSLT。如果您只需要获取一个值,请使用 XPath。

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

从外壳: ID=$(xpath config.xml 'string(/widget/@id)' )

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

/widget/@id 本身返回 "id=value" )

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

于 2009-08-26T02:51:09.253 回答