0

我知道以下 xslt 会起作用:

    <xsl:attribute name="test">
        <xsl:value-of select="substring(title, 1, 4000)"/>
    </xsl:attribute>

但不确定如果有类似以下内容并且您希望子字符串覆盖整个属性值而不仅仅是标题或子标题,该怎么办。

    <xsl:attribute name="test">
    <xsl:value-of select="title"/>
       <xsl:if test="../../sub_title != ''">
          <xsl:text> </xsl:text>
           <xsl:value-of select="../sub_title"/>
    </xsl:if>  
    </xsl:attribute>

甚至可以在定义属性的多行上应用子字符串函数吗?

4

1 回答 1

0

我认为你的意思是你想建立一个长字符串,由许多其他元素的值组成,然后截断结果。

您可以做的是使用concat函数来构建属性值,然后对其执行子字符串。

<xsl:attribute name="test">
    <xsl:value-of select="substring(concat(title, ' ', ../sub_title), 1, 4000)" />
</xsl:attribute>

在这种情况下,如果sub_title为空,您最终会在test属性的末尾有一个空格,因此您可能希望在此表达式中添加一个normalize-space

 <xsl:value-of select="normalize-space(substring(concat(title, ' ', ../sub_title), 1, 4000))" />

如果您确实想使用更复杂的表达式,另一种方法是首先在变量中进行字符串计算

<xsl:variable name="test">
   <xsl:value-of select="title"/>
   <xsl:if test="../../sub_title != ''">
      <xsl:text> </xsl:text>
      <xsl:value-of select="../sub_title"/>
   </xsl:if>  
</xsl:variable>

<xsl:attribute name="test">
    <xsl:value-of select="substring($test, 1, 4000)" />
</xsl:attribute>

顺便说一句,您可以在此处使用“属性值模板”来简化代码,而不是使用更冗长的xsl:attribute命令。只需这样做..

<myElement test="{substring($test, 1, 4000)}">

在这里,花括号表示要计算的表达式,而不是字面输出。

于 2013-09-25T22:31:41.130 回答