我认为我不能逃脱一个XPATH所以它只是为了说明这个想法。我知道我可以写一个简单的python脚本,但我更喜欢使用一个工具,例如氧气(如果可能的话,不是xmlstarlet!)
假设我有以下xml:
<?xml version="1.0" encoding="UTF-8"?>
<model>
<object name='obj1'>
<field type='int' name='fld1'/>
<field type='string' name='fld2'/>
</object>
</model>
我想要所有int
字段的名称。这很简单:
/model/object/field[@type='int']/@name
现在说我想打印对象名称和字段名称。我该怎么办? 我猜XSLT就是答案......麻烦的是,我几乎不记得任何一个,并且无法在Oxygen中找到如何使用它。
编辑:预期输出
obj1 fld1
obj2 fld7(假设我在xml中有它们)
答案 0 :(得分:1)
在xpath 2.0中,您可以进行以下操作:
for $x in /model/object/field[@type = 'int'] return concat($x/@name, ' ', $x/../@name)
返回
fld1 obj1
答案 1 :(得分:1)
作为使用for .. in
发布的XPath 2.0解决方案的替代方案,您还可以使用/model/object/field[@type='int']/concat(../@name, ':', @name)
。
答案 2 :(得分:0)
我最终使用了以下XSL(可能对某人有用):
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="1.0">
<xsl:template match="/">
<html>
<body>
<h2>Integer Fields</h2>
<table border="1">
<tr bgcolor="#9acd32">
<th>Object Name</th>
<th>Field Name</th>
</tr>
<xsl:for-each select="//object/field/[@type='int']">
<tr>
<td> <xsl:value-of select="parent::node()/@name"/> </td>
<td> <xsl:value-of select="@name"/> </td>
</tr>
</xsl:for-each>
</table>
</body>
</html>
</xsl:template>
</xsl:stylesheet>