XSL или XSLT или XSLFO: что может расширить текст? - PullRequest
1 голос
/ 02 сентября 2011

Предположим, у меня есть файл 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 ]

2 голосов
/ 02 сентября 2011

Я знаю, что это очень нетипично, но вы также можете использовать шаблоны режимов:

    <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 голос
/ 02 сентября 2011

Это еще один случай, когда в XSLT 2.0 все намного проще.

<xsl:for-each select="1 to string-length(title)">-</xsl:for-each>
1 голос
/ 02 сентября 2011

Попробуйте:

  <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 - это рекурсивный шаблон, который выводит заданное количество тире.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...