Можно ли эмулировать StringBuilder в XSLT? - PullRequest
4 голосов
/ 10 февраля 2009

Я пытаюсь эмулировать поведение StringBuilder в XSL. Есть ли способ сделать это. Это кажется довольно сложным, учитывая тот факт, что XSLT является функциональным языком программирования

Ответы [ 3 ]

4 голосов
/ 10 февраля 2009

Посмотрите на функции concat() и string-join(), может быть, это то, что вам нужно.

2 голосов
/ 11 февраля 2009

Вы можете получить собранные конкататы довольно просто с помощью небольшой рекурсии, если вы смотрите на набор узлов (при условии, что вы можете создать xpath для поиска набора узлов), делая это так, чтобы вы могли добавьте произвольные биты и кусочки в поток и из него он станет грязным.

Попробуйте это для начала (присоединиться тоже):

<xsl:template match="/">
     <xsl:variable name="s">
        <xsl:call-template name="stringbuilder">
            <xsl:with-param name="data" select="*" /><!-- your path here -->
        </xsl:call-template>
     </xsl:variable>
     <xsl:value-of select="$s" /><!-- now contains a big concat string -->
</xsl:template>

<xsl:template name="stringbuilder">
    <xsl:param name="data"/>
    <xsl:param name="join" select="''"/>
    <xsl:for-each select="$data/*">
        <xsl:choose>
            <xsl:when test="not(position()=1)">
                <xsl:value-of select="concat($join,child::text())"/>
            </xsl:when>
            <xsl:otherwise>
                <xsl:value-of select="child::text()"/>
            </xsl:otherwise>
        </xsl:choose>       
    </xsl:for-each>
</xsl:template>

Могут потребоваться все возможные расширения: возможно, вы хотите обрезать, возможно, вы также хотите туннелировать через иерархии. Я не уверен, что существует пуленепробиваемое общее решение.

1 голос
/ 10 февраля 2009

Можно использовать все доступные стандартные строковые функции XPath 2.0 , например concat(), substring(), substring-before(), substring-after(), string-join(), ... и т. Д.

Однако, , если вам нужна очень быстрая реализация строк (даже быстрее, чем строковый класс .NET), вам, вероятно, будет интересна реализация C # пальца - структура данных дерева и функции расширения, которые я предоставил для процессора Saxon XSLT, который переносит строку на основе пальца.

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