2015-05-25 111 views
3

我正在使用java程序执行XSLT转换。下面给出的是用于转换的代码块。 这里我创建一个hashmap并设置需要在XSLT中访问的值。检索XSLT中的hashmap值

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); 

进行转换的xslt代码(inputXSL)如下所示。

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

在上述XSLT程序我能够获得可变addressData的值如果我通过如“101”(参照所述students.xml)硬编码的密钥。但是,如果我遍历数组,然后传递rollnumber作为keyData address变量中的值为空。

我不知道为什么map.:get方法会接受硬编码的值而不是参数。可能我错过了一些东西。

下面给出的是传递给xslt的数据xml。

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

任何人都可以解释为什么会在地图:GET方法将采取硬编码的输入,但不是一个变量?

+0

尝试'map:get($ mapData,string($ rollNumber))'而不是map:get($ mapData,$ rollNumber)。 –

回答

2

正如你defined- HashMap<String,String>()它的键和值必须String。而你传入$rollNumbervariable类型上检索数据。

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

你必须传递之前,将它转换成Stringvariable

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

非常感谢。有效。只需要一点点改动(string)$ rollNumber而不是(String)$ rollNumber。 – vijaygopal

+0

@vijaygopal如果任何答案解决了您的问题,请将此标记为答案,这样可以对其他具有相同查询的人有所帮助。并且“关闭”以避免头顶上的问题如果您没有权限这样做,主持人可以做但您必须按照“StackOverFlow社区规则”将其标记为已回答。 –

+0

我不确定如何标记为已回答或关闭此问题。你能不能让我知道该怎么做才能遵守规则? – vijaygopal