将字符插入 XSLT 2.0 中的现有字符串序列
Inserting characters into existing sequence of strings in 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>
我想收集每个故障下所有信号的值并将它们放入标题属性中,以便在将鼠标悬停在特定 table 单元格上时可以显示有关故障的详细信息。我已经设法将我需要的信息获取到一系列字符串中,如下所示:
<td title="comp1 sig11 1 sig22 1 comp2 sig44 0">comp1 1 1 Time1 comp2 0 Time2</td>
使用这个:
<xsl:template match="faults">
<xsl:attribute name="title">
<xsl:value-of select="fault/@componentName |
fault/signals/signal/@name |
fault/signals/signal/@value"/>
</xsl:attribute>
<xsl:value-of select="fault/introduceWhen | fault/@componentName |
fault/signals/signal/@value"/>
</xsl:template>
但我想要的是这个(

是换行符):
<td title="comp1
sig11: 1
sig22: 1
comp2
sig44: 0">comp1 1 1 Time1 comp2 0 Time2</td>
我尝试使用 replace($faultDetails, ' (\d) ', ': 
')
但发现 $faultDetails
实际上是一个没有空格的字符串序列,而 replace 仅对连续的字符串进行操作。当我写这篇文章时,我意识到我几乎可以做到这一点:
<xsl:value-of select="fault/@componentName | fault/signals/signal/@name |
fault/signals/signal/@value" separator="
"/>
关于如何执行此操作的任何提示?
您只需明确列举您想要的内容即可:
<xsl:template match="/faults">
<td>
<xsl:attribute name="title">
<xsl:for-each select="fault">
<xsl:value-of select="@componentName"/>
<xsl:text> </xsl:text>
<xsl:for-each select="signals/signal">
<xsl:value-of select="@name, @value" separator=": "/>
<xsl:if test="position()!=last()">
<xsl:text> </xsl:text>
</xsl:if>
</xsl:for-each>
<xsl:if test="position()!=last()">
<xsl:text> </xsl:text>
</xsl:if>
</xsl:for-each>
</xsl:attribute>
<!-- ??? -->
</td>
</xsl:template>
如果您希望单个表达式创建属性值,那么您可以使用
<xsl:template match="faults">
<td>
<xsl:attribute name="title" select="fault/(@componentName/string(), signals/signal/concat(@name, ': ', @value))" separator="
"/>
</td>
</xsl:template>
这为我创建了 <td title="comp1
sig11: 1
sig22: 1
comp2
sig44: 0"/>
Saxon 9.6。
我有这样的结构:
<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>
我想收集每个故障下所有信号的值并将它们放入标题属性中,以便在将鼠标悬停在特定 table 单元格上时可以显示有关故障的详细信息。我已经设法将我需要的信息获取到一系列字符串中,如下所示:
<td title="comp1 sig11 1 sig22 1 comp2 sig44 0">comp1 1 1 Time1 comp2 0 Time2</td>
使用这个:
<xsl:template match="faults">
<xsl:attribute name="title">
<xsl:value-of select="fault/@componentName |
fault/signals/signal/@name |
fault/signals/signal/@value"/>
</xsl:attribute>
<xsl:value-of select="fault/introduceWhen | fault/@componentName |
fault/signals/signal/@value"/>
</xsl:template>
但我想要的是这个(

是换行符):
<td title="comp1
sig11: 1
sig22: 1
comp2
sig44: 0">comp1 1 1 Time1 comp2 0 Time2</td>
我尝试使用 replace($faultDetails, ' (\d) ', ': 
')
但发现 $faultDetails
实际上是一个没有空格的字符串序列,而 replace 仅对连续的字符串进行操作。当我写这篇文章时,我意识到我几乎可以做到这一点:
<xsl:value-of select="fault/@componentName | fault/signals/signal/@name |
fault/signals/signal/@value" separator="
"/>
关于如何执行此操作的任何提示?
您只需明确列举您想要的内容即可:
<xsl:template match="/faults">
<td>
<xsl:attribute name="title">
<xsl:for-each select="fault">
<xsl:value-of select="@componentName"/>
<xsl:text> </xsl:text>
<xsl:for-each select="signals/signal">
<xsl:value-of select="@name, @value" separator=": "/>
<xsl:if test="position()!=last()">
<xsl:text> </xsl:text>
</xsl:if>
</xsl:for-each>
<xsl:if test="position()!=last()">
<xsl:text> </xsl:text>
</xsl:if>
</xsl:for-each>
</xsl:attribute>
<!-- ??? -->
</td>
</xsl:template>
如果您希望单个表达式创建属性值,那么您可以使用
<xsl:template match="faults">
<td>
<xsl:attribute name="title" select="fault/(@componentName/string(), signals/signal/concat(@name, ': ', @value))" separator="
"/>
</td>
</xsl:template>
这为我创建了 <td title="comp1
sig11: 1
sig22: 1
comp2
sig44: 0"/>
Saxon 9.6。