将字符串转换为节点集

时间:2013-01-30 21:46:04

标签: xml xslt jstl

在我的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>

3 个答案:

答案 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()取代。