【问题标题】:Retrieving hashmap values in XSLT在 XSLT 中检索 hashmap 值
【发布时间】:2015-05-25 09:16:05
【问题描述】:

我正在使用 java 程序执行 XSLT 转换。下面给出的是用于转换的代码块。 在这里,我正在创建一个 hashmap 并设置一个需要在 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);

执行转换的 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 程序中,如果我传递一个硬编码的键,例如“101”,我可以获得变量 addressData 的值(参考students.xml)。但是,如果我遍历数组,然后将 rollnumber 作为键传递,则 addressData 变量中的值为空。

我不确定为什么 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>

谁能解释一下为什么 map:get 方法会接受硬编码输入而不是变量?

【问题讨论】:

  • 试试map:get($mapData,string($rollNumber)),而不是map:get($mapData,$rollNumber)。

标签: java xslt hashtable


【解决方案1】:

正如您所定义的那样 - HashMap&lt;String,String&gt;() 它的键和值必须是 String。当您在检索数据时将 $rollNumber 作为 variable 类型传递时。

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

您必须在通过之前将其从variable 转换为String

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

【讨论】:

  • 非常感谢。有效。只是一个小改动,我不得不使用 (string)$rollNumber 而不是 (String)$rollNumber。
猜你喜欢
  • 1970-01-01
  • 2014-10-20
  • 2017-06-06
  • 2021-12-19
  • 2019-07-29
  • 1970-01-01
  • 2013-03-08
  • 2021-07-06
  • 1970-01-01
相关资源
最近更新 更多