繁体   English   中英

将字符串转换为节点集

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM