首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将字符串转换为节点集

将字符串转换为节点集
EN

Stack Overflow用户
提问于 2013-01-31 05:46:04
回答 3查看 13.3K关注 0票数 1

在我的xsl文件中,我收到一个单独的xml文档(除了我正在转换的主xml文档之外)作为一个字符串参数(param)

假设我的参数名是seconddoc

代码语言:javascript
复制
<xsl:param name="seconddoc"></xsl:param>

代码语言:javascript
复制
<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>

我可以打印整个字符串,如下所示

代码语言:javascript
复制
<xsl:value-of select="$seconddoc" />

但我希望迭代数据(字符串),而不是一次获得整个值。我的最终目标是将此数据加载到select选项。

我是这样累的:

代码语言:javascript
复制
<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页面中的内容。

代码语言:javascript
复制
<x:transform xml="${mainxmldoc}" xslt="${xslt}">
<x:param name="seconddoc" value="<%=xmlString %>"/>
</x:transform>
EN

回答 3

Stack Overflow用户

发布于 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()取代。

票数 3
EN

Stack Overflow用户

发布于 2013-02-01 01:39:32

看起来参数不能转换为节点集。但是变量可以!所以我解决这个问题的方法。

首先,声明一个变量并将参数值放入该变量中。然后将变量转换为node-set。现在我们可以迭代节点集了

下面是完整的代码

代码语言:javascript
复制
<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>
票数 3
EN

Stack Overflow用户

发布于 2013-01-31 11:24:20

使用<x:parse>标记,您可以这样处理您的内容:

代码语言:javascript
复制
<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指向所需的节点:

代码语言:javascript
复制
<x:out select="$doc/products/product/..." />
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14614410

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档