繁体   English   中英

在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>

我想收集每个故障下所有信号的值并将它们放入title属性中,以便在悬停在特定表格单元格上时显示有关故障的详细信息。 我已经设法将我需要的信息输入到一系列字符串中,如下所示:

<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>

但我想要的是这个( &#xA;是换行符):

<td title="comp1&#xA;sig11: 1&#xA;sig22: 1&#xA;comp2&#xA;sig44: 0">comp1 1 1 Time1 comp2 0 Time2</td>

我尝试使用replace($faultDetails, ' (\\d) ', ': $1&#xA;')但发现$faultDetails实际上是一个没有空格的字符串序列,而replace只对连续的字符串进行操作。 当我写这篇文章时,我意识到我几乎可以得到这个:

<xsl:value-of select="fault/@componentName | fault/signals/signal/@name | 
                      fault/signals/signal/@value" separator="&#xA;"/>

关于如何做到这一点的任何提示?

如果您想要一个表达式来创建属性值,那么您可以使用

<xsl:template match="faults">
    <td>
        <xsl:attribute name="title" select="fault/(@componentName/string(), signals/signal/concat(@name, ': ', @value))" separator="&#xA;"/>
    </td>
</xsl:template>

这为Saxon 9.6创建了<td title="comp1&#xA;sig11: 1&#xA;sig22: 1&#xA;comp2&#xA;sig44: 0"/>

你只需要明确枚举你想要的东西:

<xsl:template match="/faults">
    <td>
        <xsl:attribute name="title">
            <xsl:for-each select="fault">
                <xsl:value-of select="@componentName"/>
                <xsl:text>&#10;</xsl:text>
                <xsl:for-each select="signals/signal">
                    <xsl:value-of select="@name, @value" separator=": "/>
                    <xsl:if test="position()!=last()">
                        <xsl:text>&#10;</xsl:text>
                    </xsl:if>
                </xsl:for-each>
                <xsl:if test="position()!=last()">
                    <xsl:text>&#10;</xsl:text>
                </xsl:if>
            </xsl:for-each> 
        </xsl:attribute>
        <!-- ??? -->
    </td>
</xsl:template>

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM