1

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

3 回答 3

3

您可能正在使用 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.

于 2013-01-31T06:25:51.293 回答
3

看起来参数无法转换为节点集。但变量可以!所以我解决它的方式。

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

这是完整的代码

<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-31T17:39:31.540 回答
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/..." />
于 2013-01-31T03:24:19.920 回答