子字符串XSLT在属性的多个值行上

时间:2013-09-25 21:19:24

标签: xslt substring

我知道以下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>

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

1 个答案:

答案 0 :(得分:0)

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

你能做什么,是使用 concat 函数来构建属性值,然后对其进行子串。

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

在这种情况下,如果 sub_title 为空,您最终会在测试属性的末尾添加一个空格,因此您可能希望添加 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)}">

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