在我的xsl文件中, 我收到一个单独的xml文档(在主xml文档旁边 我正在改造)作为字符串参数(param)
说我的参数名称是seconddoc
<xsl:param name="seconddoc"></xsl:param>
并且param值跟随(再次,我将整个事物作为字符串)
<products>
<product>
<id>1</id>
<name>pro-1</name>
</product>
<product>
<id>2</id>
<name>pro-2</name>
</product>
<product>
<id>3</id>
<name>pro-3</name>
</product>
</products>
我可以打印整个字符串,如下所示
<xsl:value-of select="$seconddoc" />
但我希望迭代数据(字符串)而不是一次获得整个值。 我的最终目标是将此数据加载到选择选项。
我累了这样:
<select>
<xsl:for-each select="$seconddoc/products/product">
<option value="{id}">
<xsl:value-of select="name" /></option>
</xsl:for-each>
</select>
但是我收到了TransformerException。 “从'java.lang.String'到'node-set'的转换无效。
更新
这就是我在jsp页面中的内容
<x:transform xml="${mainxmldoc}" xslt="${xslt}">
<x:param name="seconddoc" value="<%=xmlString %>"/>
</x:transform>
答案 0 :(得分:2)
使用<x:parse>
标记,您可以通过以下方式处理内容:
<x:parse var="doc">
<products>
<product>
<id>1</id>
<name>pro-1</name>
</product>
<product>
<id>2</id>
<name>pro-2</name>
</product>
<product>
<id>3</id>
<name>pro-3</name>
</product>
</products>
</x:parse>
然后使用XPath定位所需的节点:
<x:out select="$doc/products/product/..." />
答案 1 :(得分:2)
看起来param无法转换为node-set。但变量可以! 所以我解决它的方式。
首先,声明一个变量并将参数值放入变量中。 然后将变量转换为node-set。 现在我们可以迭代节点集
这是完整的代码
<xsl:variable name="stringVar">
<xsl:value-of select="$seconddoc" />
</xsl:variable>
<xsl:template match="/">
<xsl:for-each select="exslt:node-set($stringVar)/node()">
<select>
<xsl:for-each select="/products/product">
<option value="{id}">
<xsl:value-of select="name" />
</option>
</xsl:for-each>
</select>
</xsl:for-each>
</xsl:template>
答案 2 :(得分:1)
您可能正在使用JDK附带的内置XSLT 1.0处理器,这是Xalan的一个版本。 XSLT 1.0或2.0中没有标准方法来调用XML解析器(这是将字符串转换为节点所需的操作)。您需要在转换之外进行转换(将节点作为参数传递),或使用执行该作业的扩展。我似乎记得Xalan的exslt:node-set()实现可能会这样做;看看这个。或者,既然你在Java世界,如果你升级到XSLT 2.0(意思是Saxon),那么很多事情会容易得多。我不确定Saxon在JSP中的表现如何(它当然可以完成,但我不知道你是否可以使用x:transform标签库)。 Saxon有一个saxon:parse扩展函数,它在草案3.0规范中被标准函数parse-xml()取代。