我有以下结构,我想找出最相关的数据并将它们粘在一起作为标题。
<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的结构,那也是有意义的。
答案 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), ' ')