如何使用xslt为每个逗号分隔值创建单独的html元素

时间:2014-11-10 12:08:58

标签: xml xslt xslt-1.0

我有xml格式,其中包含以下值的数组:



<xml total="446">
    <document>
        <id><![CDATA[binary:181-22559]]></id>
        <language><![CDATA[[Croatian]]]></language>
        <application><![CDATA[]]></application>
    </document>
  <document>
        <id><![CDATA[binary:181-22559]]></id>
        <language><![CDATA[[English]]]></language>
        <application><![CDATA[[Outdoor, LED, Indoor, Signage]]]></application>
   </document>
</xml>
&#13;
&#13;
&#13;

当我尝试使用xslt渲染上面的xml时,我面临以下两个问题: 1.它与方括号一起呈现&#39; [&#39; 2.我无法为逗号分隔值创建单独的html元素。

以下是我的xslt:

&#13;
&#13;
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

	<xsl:output method="xml" indent="yes"/>
	 
	<xsl:template match="/">
      
      <hr class="grid-hr inner-grid"/>
		<fieldset>
			<legend>%%filter_document_language%%:</legend>
			<label class="visuallyhidden" for="document-language">Language:</label>
			<select id="document-language">
				<option value="All" selected="selected">All</option>
				<xsl:if test="/xml/document/language/text()">
					<xsl:for-each select="xml/document">
						<xsl:sort select="language"/>
						<xsl:if test="language/text()">
							<xsl:variable name="lastLanguage" select="language"/>
							<xsl:if test="not(preceding-sibling::document[language=$lastLanguage])">
								<xsl:variable name="language">
									<xsl:value-of select="language"/>
								</xsl:variable>
								<option value="{$language}" selected=""><xsl:copy-of select="$language" /></option>
							</xsl:if>
						</xsl:if>
					</xsl:for-each>
				</xsl:if>
			</select>
		</fieldset>
        <hr class="grid-hr inner-grid"/>
			<fieldset>
			
				<legend>%%filter-by-application%%:</legend>
				<ul class="itembrowser-filter">
					<xsl:for-each select="xml/document">
						<xsl:sort select="application"/>
						<xsl:if test="application/text()">
								<xsl:variable name="lastApplication" select="application"/>
								<xsl:if test="not(preceding-sibling::document[application=$lastApplication])">
									<xsl:variable name="application">
										<xsl:value-of select="application"/>

									</xsl:variable>
									<li>
										<label>
											<input type="checkbox" class="input-big-checkbox" name="application-filter" value="{$application}"/>
											<span class="label"><xsl:copy-of select="$application" /></span>
										</label>
									</li>
								</xsl:if>
							
						</xsl:if>
					</xsl:for-each>
				</ul>
			</fieldset>
    </xsl:template>
	
</xsl:stylesheet>
&#13;
&#13;
&#13;

我的预期输出应如下:

&#13;
&#13;
<hr class="grid-hr inner-grid">
<fieldset>
	<legend>Filter by Document Language:</legend>
	<label class="visuallyhidden" for="document-language">Language:</label>
	<select id="document-language">
		<option value="All" selected="selected">All</option>
		<option value="Croatian" selected="">Croatian</option>
		<option value="English" selected="">English</option>
	</select>
</fieldset>
<hr class="grid-hr inner-grid">
<fieldset>
	<legend>Filter by Application:</legend>
	<ul class="itembrowser-filter">
		<li>
			<label>
				<input type="checkbox" class="input-big-checkbox" name="application-filter" value="Outdoor">
				<span class="label">Outdoor</span>
			</label>
			<label>
				<input type="checkbox" class="input-big-checkbox" name="application-filter" value="LED]">
				<span class="label">LED</span>
			</label>
			<label>
				<input type="checkbox" class="input-big-checkbox" name="application-filter" value="Indoor">
				<span class="label">Indoor</span>
			</label>
			<label>
				<input type="checkbox" class="input-big-checkbox" name="application-filter" value="Signage">
				<span class="label">Signage</span>
			</label>
		</li>
	</ul>
</fieldset>
&#13;
&#13;
&#13;

如果有人可以帮助我,那就太棒了。

1 个答案:

答案 0 :(得分:0)

  
      
  1. 它与方括号'['
  2. 一起呈现   

这些方括号是数据的一部分。您的数据提供商似乎不理解how to markup CDATA。在他们学习之前,您必须自己删除额外的括号,例如替换:

<xsl:value-of select="language"/>

使用:

<xsl:value-of select="translate(language, '[]', '')"/>

或:

<xsl:value-of select="substring(language, '2', string-length(language) - 2)"/>

重新提出第二个问题,我建议您与XSLT 1.0一起搜索“tokenize”。如果您无法从之前的帖子中解决问题,请发布单独的问题。另请注意,您的特定处理器可能支持EXSLT str:tokenize()扩展函数,因此无需使用递归命名模板。

我还建议您阅读Muenchian分组。