Retrieving hashmap values ​​in XSLT

I am performing XSLT transformation using a java program. Below is the block of code that is used for the conversion. Here I am creating a hashmap and setting the value to be retrieved in XSLT.

    TransformerFactory factory = TransformerFactory.newInstance();
    StreamSource xslStream = new StreamSource(inputXSL);
    Transformer transformer = factory.newTransformer(xslStream);
    Map<String,String> mapData = new HashMap<String,String>();
    mapData.put("103", "188 E 6th Street");
    transformer.setParameter("mapData", mapData);

      

Shown below is the xslt (inputXSL) code that performs the conversion.

<?xml version="1.0" encoding="UTF-8" ?>
<xsl:stylesheet version="1.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:map="xalan://java.util.Map"
    extension-element-prefixes="map">

<xsl:param name="mapData"/>

<xsl:template match="/class">

        <html>
            <body>
                <h3>Student Details</h3>
                <table border="1">
                    <tr bgcolor="#E6E6FA">
                        <th>Roll Number</th>
                        <th>First Name</th>
                        <th>Last Name</th>
                        <th>Nick Name</th>
                        <th>Marks</th>
                        <th>Address</th>
                    </tr>


                    <xsl:for-each select="student">
                        <tr>
                            <xsl:variable name="rollNumber" select="./@rollno"/>
                            <xsl:variable name="addressData" select="map:get($mapData,$rollNumber)"/>
                            <td>
                                <xsl:value-of select="./@rollno" />
                            </td>
                            <td>
                                <xsl:value-of select="firstname" />
                            </td>
                            <td>
                                <xsl:value-of select="lastname" />
                            </td>
                            <td>
                                <xsl:value-of select="nickname" />
                            </td>
                            <td>
                                <xsl:value-of select="marks" />
                            </td>
                            <td>
                                <xsl:value-of select="$addressData" />
                            </td>
                        </tr>
                    </xsl:for-each>
                </table>
            </body>
        </html>
    </xsl:template>
</xsl:stylesheet>

      

In the above xslt program, I can get the value for the addressData variable if I pass in a hardcoded key like '101' (refer to students.xml). But if I iterate over the array and then pass the number as a key, the value in the addressData variable is empty.

I'm not sure why the map.:get method will take a hardcoded value but not a parameter. I guess I'm missing something.

Following is the xml data that is passed to the xslt.

    <?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="ParseResponse.xsl"?>
<class>
    <student rollno="101">
        <firstname>PPP</firstname>
        <lastname>LLL</lastname>
        <nickname>JJJ</nickname>
        <marks>85</marks>
    </student>
    <student rollno="102">
        <firstname>AAA</firstname>
        <lastname>CCC</lastname>
        <nickname>DDD</nickname>
        <marks>95</marks>
    </student>
    <student rollno="103">
        <firstname>KKK</firstname>
        <lastname>LLL</lastname>
        <nickname>WWW</nickname>
        <marks>90</marks>
    </student>
</class>

      

Can someone explain why the map: get method will accept hard coded input but not a variable?

+3


source to share


1 answer


As you determined - HashMap<String,String>()

its keys and values ​​should be String

. As long as you get $rollNumber

as a type variable

when retrieving data.

<xsl:variable name="addressData" select="map:get($mapData,$rollNumber)"/>

      



before transferring, you must transfer it to String

from variable

.

<xsl:variable name="addressData" select="map:get($mapData,(String)$rollNumber)"/>

      

+2


source







All Articles