在XSL中将带有分隔符的字符串粘合在一起

时间:2016-09-24 00:20:38

标签: xslt xslt-2.0

我有以下结构,我想找出最相关的数据并将它们粘在一起作为标题。

<faults>
  <fault componentName="comp1">
    <introduceWhen>Time1</introduceWhen>
    <signals>
      <signal name="sig11" value="1"/>
      <signal name="sig22" value="1"/>
    </signals>
  </fault>
  <fault componentName="comp2">
    <introduceWhen>Time2</introduceWhen>
    <signals>
      <signal name="sig44" value="0"/>
    </signals>
  </fault>
</faults>

我希望它是comp1 1 1 comp2 0,但到目前为止,我管理的最好的是comp1 1 1comp2 0,使用此:

<xsl:template match="faults">
  <xsl:for-each select="fault">
    <xsl:variable name="compName" select="@componentName"/>
    <xsl:variable name="sigVals" select="string-join(signals/signal/@value, ' ')"/>
    <xsl:value-of select="concat(@compName, ' ', $sigVals)"/>
  </xsl:for-each>
</xsl:template>

我所拥有的解决方案并不是很优雅,所以如果你有其他方法,我非常希望看到它们。我也完全控制了XML,所以如果有任何好的解决方案可以改变XML的结构,那也是有意义的。

2 个答案:

答案 0 :(得分:3)

正如您似乎正在使用XSLT 2.0,您可以简单地做到:

<xsl:template match="/faults">
    <xsl:for-each select="fault">
        <xsl:value-of select="@componentName, signals/signal/@value"/>
        <xsl:text> </xsl:text>
    </xsl:for-each>
</xsl:template>

或者,如果你想要更加细致:

<xsl:template match="/faults">
    <xsl:for-each select="fault">
        <xsl:value-of select="@componentName, signals/signal/@value"/>
        <xsl:if test="position()!=last()">
            <xsl:text> </xsl:text>
        </xsl:if>
    </xsl:for-each>
</xsl:template>

或者(从Michael Kay的回答中暗示)甚至更简单:

<xsl:template match="/faults">
    <xsl:value-of select="fault/@componentName | fault/signals/signal/@value"/>
</xsl:template>

xsl:value-of指令已在各个值之间插入分隔符;无需使用string-join()

答案 1 :(得分:2)

不仅仅是

string-join((//@componentName | //@value), ' ')