在xsd文件中,我定义了一个元素有更多的出现位置:
<xs:element name="Type" type="xs:string" maxOccurs="unbounded"/>
因此在xml文件中,该对象可能包含更多“Type”元素。 在xsl文件中,我所做的是:
<xsl:for-each select="Movies/Movie">
<tr>
<td><xsl:value-of select="Type"/></td>
</tr>
</xsl:for-each>
通过这种方法,我只能获得该节点集中的第一个“Type”元素。但我想选择“电影/电影”节点集中存在的所有“类型”元素,有没有办法实现这个?
答案 0 :(得分:2)
在XSLT 1.0中,当xsl:value-of选择多个节点时,将忽略除第一个节点之外的所有节点。在XSLT 2.0中,您将获得所有选定节点的空格分隔连接。这听起来好像是在使用XSLT 1.0。如果要在XSLT 1.0中选择多个元素,则需要for-each:
<xsl:for-each select="Type">
<xsl:value-of select="."/>
</xsl:for-each>
答案 1 :(得分:2)
您需要使用其他xsl:for-each
或使用xsl:apply-templates
代替。
以下是不使用xsl:for-each
...
XML输入
<Movies>
<Movie>
<Type>a</Type>
<Type>b</Type>
<Type>c</Type>
</Movie>
<Movie>
<Type>1</Type>
<Type>2</Type>
<Type>3</Type>
</Movie>
</Movies>
XSLT 1.0
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="/*">
<html>
<xsl:apply-templates/>
</html>
</xsl:template>
<xsl:template match="Movie">
<tr>
<xsl:apply-templates/>
</tr>
</xsl:template>
<xsl:template match="Type">
<td><xsl:value-of select="."/></td>
</xsl:template>
</xsl:stylesheet>
<强>输出强>
<html>
<tr>
<td>a</td>
<td>b</td>
<td>c</td>
</tr>
<tr>
<td>1</td>
<td>2</td>
<td>3</td>
</tr>
</html>
答案 2 :(得分:0)
尝试以下内容(匹配并选择索引为1):
<xsl:template match="/Movies/Movie">
<xsl:value-of select="Type[1]"/>
</xsl:template>