[英]Convert string to node-set
在我的xsl文件中,我收到一个单独的xml文档(正在转换的主要xml文档旁边)作为字符串参数(参数)
说我的参数名是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>
<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>
使用<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/..." />
看起来参数无法转换为节点集。 但是变量可以! 所以我解决它的方式。
首先,声明一个变量并将参数值放入变量中。 然后将变量转换为节点集。 现在我们可以迭代节点集
这是完整的代码
<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>
您可能正在使用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()代替。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.