XSLT逗号分隔列表子列表

时间:2015-09-08 07:45:07

标签: xml xslt

如何使用此

进行XSLT
<lines>
  <data>
    a
  </data>
  <data>
    b
  </data>
  <data>
    a
  </data>
  <data>
    b
  </data>
  <data>
    c
  </data>
  <data>
    b
  </data>
  <data>
    c
  </data>
</lines>

<resultdata>
  b,b,b
</resultdata>

据我所知,我应该使用

<xsl:for-each select="/data"> 

<xsl:if test="data(text)='b'">

<xsl:text>, </xsl:text>

但究竟是怎么回事?

1 个答案:

答案 0 :(得分:3)

而不是这样做......

 <xsl:for-each select="/data"> 

你需要这样做......

<xsl:for-each select="/lines/data"> 

这是因为初始/表示文档节点,它是lines的父节点。但是,如果您当时位于lines元素上(通过位于匹配lines的模板中),实际上会更好。然后你可以这样做(因为没有前面的/表达式然后相对于当前节点。)

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

要检查节点的文本,您需要执行以下操作:

<xsl:if test="text()='b'">

或者更确切地说,因为你有空格,你应该这样做:

<xsl:if test="normalize-space()='b'">

或者更好的是,您将条件添加到xsl:for-each本身。

<xsl:for-each select="data[normalize-space() = 'b']">

试试这个XSLT开始吧:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
    <xsl:output method="xml" indent="yes" />

    <xsl:template match="lines">
        <resultdata>
            <xsl:for-each select="data[normalize-space() = 'b']">
                <xsl:if test="position() > 1">
                    <xsl:text>, </xsl:text>
                </xsl:if>
                <xsl:value-of select="normalize-space()" />
            </xsl:for-each>
        </resultdata>
    </xsl:template>
</xsl:stylesheet>