Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xslt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Xml xsl:选择出现次数较多的元素_Xml_Xslt - Fatal编程技术网

Xml xsl:选择出现次数较多的元素

Xml xsl:选择出现次数较多的元素,xml,xslt,Xml,Xslt,在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>

在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”元素。但是我想选择“Movies/Movie”节点集中存在的所有“Type”元素,有没有办法实现这一点?

尝试以下方法(使用索引1进行匹配和选择):


在XSLT1.0中,当xsl:value of选择多个节点时,除第一个节点外,所有节点都将被忽略。在XSLT2.0中,可以获得所有选定节点的空间分隔连接。从您的证据来看,似乎您正在使用XSLT1.0。如果要在XSLT 1.0中选择多个元素,则每个元素都需要一个:

<xsl:for-each select="Type">
  <xsl:value-of select="."/>
</xsl:for-each>

您需要为每个
使用另一个
xsl:foreach
或使用
xsl:apply-templates

下面是一个示例,它没有为每个
使用
xsl:

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>
<html>
   <tr>
      <td>a</td>
      <td>b</td>
      <td>c</td>
   </tr>
   <tr>
      <td>1</td>
      <td>2</td>
      <td>3</td>
   </tr>
</html>

A.
B
C
1.
2.
3.
XSLT1.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>

输出

<Movies>
    <Movie>
        <Type>a</Type>
        <Type>b</Type>
        <Type>c</Type>
    </Movie>
    <Movie>
        <Type>1</Type>
        <Type>2</Type>
        <Type>3</Type>
    </Movie>
</Movies>
<html>
   <tr>
      <td>a</td>
      <td>b</td>
      <td>c</td>
   </tr>
   <tr>
      <td>1</td>
      <td>2</td>
      <td>3</td>
   </tr>
</html>

A.
B
C
1.
2.
3.

对另一个问题的回答很有趣,可能会有所帮助:@madth3:Oops,我误解了这个问题。更新了答案。是的,它很有效,我发现XSLT2.0更好,非常感谢。