在我的xsl文件中,我收到一个单独的xml文档(除了我正在转换的主xml文档之外)作为一个字符串参数(param)
假设我的参数名是seconddoc
<xsl:param name="seconddoc"></xsl: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选项。
我是这样累的:
<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>发布于 2013-01-31 14:25:51
您可能正在使用JDK附带的内置XSLT1.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()取代。
发布于 2013-02-01 01:39:32
看起来参数不能转换为节点集。但是变量可以!所以我解决这个问题的方法。
首先,声明一个变量并将参数值放入该变量中。然后将变量转换为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>发布于 2013-01-31 11:24:20
使用<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/..." />https://stackoverflow.com/questions/14614410
复制相似问题