จะใช้ตัวดำเนินการภายใน select ในแท็ก xsl ได้อย่างไร?

ฉันมีไฟล์ 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>

และเมื่อฉันต้องการใช้คำอธิบายทรัพยากรทั้งสองในเวอร์ชัน API เช่น 2.1 โดยใช้ groovy และ XmlParser ฉันสามารถทำได้โดย:

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

ตอนนี้ฉันต้องการทำสิ่งนี้ แต่เป็นไฟล์ HTML โดยใช้ XSLT ฉันลอง:

<?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>

แต่มันไม่ทำงาน ฉันสังเกตเห็นว่าปัญหาเกิดขึ้นกับตัวดำเนินการ '‹=', '>' และ 'และ' ฉันเปลี่ยนไป

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

to

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

or to

api[@max&gt;'2.1']

และมันก็ได้ผล แต่

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

ไม่. http://www.w3schools.com/xsl/xpath_operators.asp บอกว่าควร สำหรับ xpath แต่ xsl select มีปัญหากับมันเหรอ?


person Elej    schedule 14.12.2015    source แหล่งที่มา


คำตอบ (1)


ใส่นิพจน์บูลีนทั้งสองไว้ในเพรดิเคตเดียว ([]) หากคุณต้องการใช้ทั้งสองพร้อมกันกับองค์ประกอบ api หนึ่งองค์ประกอบ :

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

ข้อมูลข้างต้นควรวนซ้ำองค์ประกอบ api ที่มีค่าแอตทริบิวต์ min น้อยกว่าหรือเท่ากับ 2.1 และค่าแอตทริบิวต์ max ที่มากกว่า 2.1 อย่างถูกต้อง

person har07    schedule 14.12.2015
comment
อาจต้องการวางเครื่องหมายคำพูดไว้ประมาณ 2.1 เนื่องจากน่าจะเป็นการเปรียบเทียบที่เป็นตัวเลข ไม่ใช่คำศัพท์ตามที่ต้องการที่นี่ - person kjhughes; 14.12.2015
comment
ใน XPath 1.0 ตัวดำเนินการ < และ > จะทำการเปรียบเทียบตัวเลขเสมอ (ตัวถูกดำเนินการทั้งสองตัวถูกแปลงเป็นตัวเลข) - แต่ในแง่หนึ่งที่ทำให้การเปรียบเทียบตัวเลขนั้นมีความสำคัญมากยิ่งขึ้น เพราะไม่เช่นนั้น คุณจะมีปัญหาความเข้ากันได้เมื่อเปลี่ยนไปใช้ 2.0 - person Michael Kay; 14.12.2015