为什么我的输出不是以逗号分隔的列表?

时间:2016-02-09 23:53:21

标签: xml xslt xslt-1.0

我是XSLT的新手。我试图在XML 1.0中解析结果并生成:

Keyword A,Keyword B,Keyword C,Keyword D

但未显示分隔符。我得到了结果

Keyword A Keyword B Keyword C Keyword D 

我的XML和XSLT代码如下:

Product.xml

<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="style.xsl" ?>
<products>
    <product id="1" name="My Product">
        <keywords>
            <keyword>
                Keyword A
            </keyword>
            <keyword>
                Keyword B
            </keyword>
            <keyword>
                Keyword C
            </keyword>
            <keyword>
                Keyword D
            </keyword>
        </keywords>
    </product>
</products>

style.xsl

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:template match="/">
        <html>
            <body>      
            <xsl:for-each select="products/product">
                <xsl:for-each select="keywords">
                    <xsl:choose>
                        <xsl:when test="position()=last()">
                            <xsl:value-of select="current()"/>
                        </xsl:when>                 
                        <xsl:otherwise>
                            <xsl:value-of select="current()"/>
                            <xsl:text>&#44;</xsl:text>
                        </xsl:otherwise>
                    </xsl:choose>
                </xsl:for-each>
            </xsl:for-each>
            </body>
        </html>
    </xsl:template>
</xsl:stylesheet>

我已经看过if-else statement in XSLT,但我找不到答案。

2 个答案:

答案 0 :(得分:1)

更改

<xsl:for-each select="keywords">

<xsl:for-each select="keywords/keyword">

否则,您将迭代单个keywords元素,落入第一个xsl:when,因为唯一的位置等于最后一个位置,并输出字符串值{{1这将是keyword子项的所有字符串值的串联,没有任何逗号。

答案 1 :(得分:1)

请注意,在XSLT 2.0中,您可以执行

<xsl:for-each select="products/product">
  <xsl:value-of select="keywords/keyword" separator=","/>
</xsl:for-each>

如果你必须手工插入分隔符,那么为避免不必要的前瞻,最好将它们放在除第一个之外的每个元素之前,而不是在除了最后一个之后的每个元素之后:所以

<xsl:for-each select="products/product/keywords/keyword">
    <xsl:if test="position() != 1">,</xsl:if>
    <xsl:value-of select="."/>
</xsl:for-each>