XSL或XSLT或XSLFO:哪些可以扩展文本?

时间:2011-09-01 22:31:47

标签: xslt

假设我有一个XML文件:

<document>
  <title>How the West was Won</title>
  <chapter>
    Lorem Ipsum Blah .....
  </chapter>
</document>

是否可以使用XSLT或XSLFO或XSL来呈现如下标题:

How the West was Won
--------------------

Lorem Ipsum Blah .....

如何在标题后的行上生成正确数量的短划线?

3 个答案:

答案 0 :(得分:2)

我知道这非常不典型,但您也可以使用模板模式:

    <xsl:template match="title">
        <xsl:variable name="dashes">
            <xsl:apply-templates select="." mode="dashes"/>
        </xsl:variable>
        <xsl:value-of select="concat(.,'&#10;',$dashes,'&#10;')"/>
    </xsl:template>

    <xsl:template match="text()" mode="dashes">
        <xsl:param name="length" select="string-length() - 1"/>
        <xsl:text>-</xsl:text>
        <xsl:apply-templates select="self::text()[boolean($length)]" 
            mode="dashes">
            <xsl:with-param name="length" select="$length - 1"/>
        </xsl:apply-templates>
    </xsl:template>

答案 1 :(得分:1)

试试这个:

  <xsl:template match="title">
  <xsl:value-of select="text()"/>
  <xsl:text>
  </xsl:text>
  <xsl:call-template name="Underline">
    <xsl:with-param name="length" select="string-length(text())"/>
  </xsl:call-template>
  </xsl:template>

  <xsl:template name="Underline">
    <xsl:param name="length"/>
    <xsl:choose>
      <xsl:when test="$length > 0">-<xsl:call-template name="Underline"><xsl:with-param name="length" select="$length - 1"/></xsl:call-template></xsl:when>
    </xsl:choose>    
  </xsl:template>

Underline是一个递归模板,输出给定数量的破折号。

答案 2 :(得分:1)

这是另一种情况,它在XSLT 2.0中更简单。

<xsl:for-each select="1 to string-length(title)">-</xsl:for-each>