簡體   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