3

在 xsd 文件中,我定义了一个出现次数较多的元素:

<xs:element name="Type" type="xs:string" maxOccurs="unbounded"/>

所以在 xml 文件中,对象可能包含更多的“类型”元素。在 xsl 文件中,我所做的是:

<xsl:for-each select="Movies/Movie">
<tr>
<td><xsl:value-of select="Type"/></td>
</tr>
</xsl:for-each>

通过这种方法,我只能获得该节点集中的第一个“Type”元素。但是我想选择“电影/电影”节点集中存在的所有“类型”元素,有没有办法实现这一点?

4

3 回答 3

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>
于 2012-11-16T22:35:52.167 回答
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>
于 2012-11-16T22:36:09.593 回答
0

尝试以下操作(匹配并选择索引为 1):

  <xsl:template match="/Movies/Movie">
       <xsl:value-of select="Type[1]"/>
  </xsl:template>
于 2012-11-16T19:47:55.013 回答