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