2012-11-16 63 views
3

在XSD文件選擇元素,我定義了一個元件具有更多的事件:的xsl:誰發生多次

<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> 

通過這種方法,我只能得到該節點集中的第一個「類型」元素。但是我想選擇「電影/電影」節點集中存在的所有「類型」元素,有沒有辦法實現這一點?

+0

對另一個問題的這個答案很有趣,可能會有所幫助:http://stackoverflow.com/a/6014992/422353 – madth3

回答

2

在XSLT 1.0,當XSL:價值的選擇一個以上的節點,但首先是將被忽略。在XSLT 2.0中,您可以獲得所有選定節點的空格分隔連接。從您的證據聽起來就好像您正在使用XSLT 1.0一樣。如果你想選擇在XSLT 1.0多個元素,你需要的for-each:

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

是的,它可以工作,我發現XSLT 2.0更好,非常感謝。 – basten51

0

如下試一下(匹配,並與索引中選擇:1):

<xsl:template match="/Movies/Movie"> 
     <xsl:value-of select="Type[1]"/> 
    </xsl:template> 
+0

@ madth3:哎呀,我誤解了這個問題。更新了答案。 –

+0

@downvoter:請留下一些有用的評論。 –

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>