在xsl中连接变量值

时间:2015-08-17 09:12:45

标签: xml xslt

    XML:
        <Form id="id8" name="1234_A" accessRefs="#id4" subType="Form" subClass="Form">  
          <UserData id="id10" type="Attributes">
            <UserValue value="val1" title="var1"></UserValue>
            <UserValue value="val2" title="var2"></UserValue>
            <UserValue value="val3" title="var3"></UserValue>
            <UserValue value="val4" title="var4"></UserValue>    
            <UserValue value="val6" title="var6"></UserValue>
            <UserValue value="val7" title="var7"></UserValue>    
          </UserData>
        </Form>
   XSL: 
    <xsl:variable name="var1" select="$ele/plm:UserData/plm:UserValue[@title='var1']"/>
        <xsl:variable name="var2" select="$ele/plm:UserData/plm:UserValue[@title='var2']"/>
        <xsl:variable name="var3" select="$ele/plm:UserData/plm:UserValue[@title='var3']"/>
        <xsl:variable name="var6" select="$ele/plm:UserData/plm:UserValue[@title='var6']"/>
        <Cell>
          <Data ss:Type="String">
            <xsl:variable name="temp" select="concat($var1/@value,',',$var2/@value,',',$var3/@value,',',$var6/@value)"/>
          </Data>
        </Cell>

在上面的XML中,我想得到值(var1,var2,var3,var6)。将这些值变为变量。 现在在XSL中我想使用逗号分隔符连接变量值。但是如果任何变量值为空,我会得到多个逗号(,,)。基本上我必须忽略一个变量,如果它是空的。请帮我。 我正在使用XSLT1.0

1 个答案:

答案 0 :(得分:0)

如果var1 - var4 UserValue元素保证在原始XML中以特定顺序出现,那么它就是一个直截了当的for-each

<xsl:variable name="temp">
  <xsl:for-each select="$ele/plm:UserData/plm:UserValue
       [@title='var1' or @title='var2' or @title='var3' or @title='var6']
       [normalize-space(@value)]">
    <xsl:if test="position() &gt; 1">,</xsl:if>
    <xsl:value-of select="@value" />
  </xsl:for-each>
</xsl:variable>

[normalize-space(@value)]谓词排除了存在但具有空值的任何目标元素。如果保证var1-var4顺序与文档顺序匹配,那么您需要使用技巧强制for-each以正确的顺序为您提供元素。

<xsl:variable name="ordering" select="'|var1|var2|var3|var6|'" />

<xsl:variable name="temp">
  <xsl:for-each select="$ele/plm:UserData/plm:UserValue
       [@title='var1' or @title='var2' or @title='var3' or @title='var6']
       [normalize-space(@value)]">
    <xsl:sort select="
          string-length(substring-before($ordering, concat('|', @title, '|'))"
      data-type="number" />
    <xsl:if test="position() &gt; 1">,</xsl:if>
    <xsl:value-of select="@value" />
  </xsl:for-each>
</xsl:variable>