如何在xsl标签中选择运算符?

时间:2015-12-14 13:50:14

标签: xml xslt xpath

我有XML文件(一些服务文档)如下所示:

<?xml version="1.0" encoding="UTF-8"?>
<apis>
    <api min="2.2" max="3.0">
        <resource name="products">
            <description>products from 2.2 to 3.0</description>
        </resource>
        <resource name="brands">
            <description>brands from 2.2 to 3.0</description>
        </resource>
    </api>
    <api min="1.0" max="2.2">
        <resource name="products">
            <description>products from 1.0 to 2.2</description>
        </resource>
    </api>
    <api min="2.1" max="2.2">
        <resource name="brands">
            <description>brands from 2.1 to 2.2</description>
        </resource>
    </api>
    <api min="1.0" max="2.1">
        <resource name="brands">
            <description>brands from 1.0 to 2.1</description>
        </resource>
    </api>
</apis>

当我想使用groovy和XmlParser在API版本中获取两个资源描述时,我可以通过以下方式执行此操作:

def rawXml = new XmlParser().parse ( 'file.xml' )
rawXml.api.findAll {
         node -> node.@min <= '2.1' && node.@max > '2.1' 
}.resource.description

现在我想要使用XSLT进入HTML文件。我试试:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

    <xsl:template match="apis">
        <html>
            <body>
                <table>
                    <tr>
                        <th>Resource name</th>
                        <th>Resource description</th>
                    </tr>
                    <xsl:for-each select="api[@min<='2.1'] and api[@max>'2.1']">
                        <xsl:for-each select="resource">
                            <tr>
                                <td>
                                    <xsl:value-of select="@name"/>
                                </td>
                                <td>
                                    <xsl:value-of select="description"/>
                                </td>
                            </tr>
                        </xsl:for-each>
                    </xsl:for-each>
                </table>
            </body>
        </html>
    </xsl:template>

</xsl:stylesheet>

但它不起作用。我注意到问题在于操作员&#39;&lt; =&#39;,&#39;&gt;&#39;和&#39;和&#39;。我改变了

'api[@min<='2.1'] and api[@max>'2.1']'

'api[@min&lt;='2.1']'

api[@max&gt;'2.1']

它有效。但

'api[@min&lt;='2.1'] and api[@max&gt;'2.1']'

没有按&#39;吨。 http://www.w3schools.com/xsl/xpath_operators.asp告诉它应该用于xpath,但是xsl select有问题吗?

1 个答案:

答案 0 :(得分:1)

如果要将两个布尔表达式同时应用于一个[]元素,请将两个布尔表达式放在一个谓词(api)中:

<xsl:for-each select="api[@min &lt;= '2.1' and @max &gt; '2.1']">

以上内容应正确循环apimin属性值小于或等于2.1max属性值大于2.1的元素