0

我认为我无法摆脱一个 XPATH,所以这只是为了说明这个想法。我知道我可以编写一个简单的 Python 脚本,但我更喜欢使用工具,例如 Oxygen(如果可能,不要使用 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 中有它们)

4

3 回答 3

1

在 xpath 2.0 中,您可以进行以下操作:

for $x in /model/object/field[@type = 'int'] return concat($x/@name, ' ', $x/../@name)

它返回

fld1 obj1
于 2013-10-01T13:47:44.707 回答
1

作为已发布的 XPath 2.0 解决方案的替代方案,for .. in您还可以使用/model/object/field[@type='int']/concat(../@name, ':', @name).

于 2013-10-01T14:06:17.010 回答
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>
于 2013-10-01T14:49:58.987 回答