如何在一个xpath中打印2个值或者怎么做呢?

时间:2013-10-01 13:35:27

标签: xml xslt xpath

我认为我不能逃脱一个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中有它们)

3 个答案:

答案 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>