Я пытаюсь эмулировать поведение StringBuilder в XSL. Есть ли способ сделать это. Это довольно сложно, учитывая тот факт, что XSLT является функциональным языком программирования.Можно ли эмулировать StringBuilder в XSLT?
ответ
Вы можете получить аккумулирующие конкатеты просто с небольшим количеством рекурсии, если вы смотрите на набор узлов (до тех пор, пока вы можете построить 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>
Всевозможные расширений, которые могут потребоваться: возможно, вы хотите обрезать, возможно, вы хотите, чтобы туннель через иерархии, а также. Я не уверен, что существует пуленепробиваемое общее решение.
Переменная $ join не служит никакой цели. Это сбивает с толку и вводит в заблуждение! Вместо «concat» ($ join, child :: text()) «используйте только« text() ». Целый
Вы действительно особенный тип тролля, разве вы не Dimitre? ОЧЕНЬ ОЧЕНЬ ЧИСТЫЙ параметр соединения является необязательным (см., Где у него есть выбор?), который позволяет строителю функционировать как метод .join (см., где я говорю «действительно присоединяется»?), который требует цикла, который обеспечивает расширение («для стартеров»?). – annakata
@annakata Я полностью не понимаю, что для вас «ОЧЕНЬ ОЧЕНЬ ОЧЕНЬ ОЧЕНЬ». Мне очень любопытно, что это может быть. Можете ли вы объяснить и дать небольшой пример использования параметра «join»? –
Посмотрите на функции concat()
и string-join()
, возможно, это то, что вам нужно.
Я ищу только функциональность добавления. И это означает, что я хочу сохранить результат после добавления в той же переменной –
Нет, это будет невозможно. Переменные неизменяемы в XSLT, вы не можете их изменить. Вы можете использовать рекурсию, чтобы получить аналогичный результат. Что именно вы хотите сделать? Можете ли вы опубликовать код на свой вопрос? – Tomalak
Я думаю, рекурсия может работать здесь. Спасибо всем. –
Вы можете использовать все доступные standard XPath 2.0 string functions, такие как concat()
, substring()
, substring-before()
, substring-after()
, string-join()
, ... и т.д.
Однако в случае, если необходимо очень быстрое внедрение строк (даже быстрее, чем класс .NET string), вы, вероятно, будете интересоваться C# implementationfinger-tree data structure и the extension functions I provided для Saxon XSLT-процессора, которые обертывают строку на основе пальца.
- 1. Можно ли эмулировать ftp-сервер?
- 2. Можно ли эмулировать стрелку в sublimetext3?
- 3. Можно ли эмулировать методы объекта в C?
- 4. Можно ли использовать XSLT?
- 5. Можно ли улучшить XSLT?
- 6. Можно ли эмулировать ARM на Windows 8?
- 7. Можно ли эмулировать прямой доступ к государству?
- 8. Можно ли полностью эмулировать виртуальный оператор ++ (int)?
- 9. Можно ли эмулировать движущуюся точку через полилинию?
- 10. Можно ли эмулировать strcpy с помощью malloc?
- 11. Можно ли связать xslt с другим xslt?
- 12. XSLT: Как эмулировать IF-ELSE Пунктом
- 13. Можно ли эмулировать виртуальный каталог в Visual Studio 2008?
- 14. Можно ли эмулировать или использовать Python в Rust?
- 15. Можно ли эмулировать ARM NEON в программе x86 C?
- 16. Можно ли эмулировать пограничный коллапс (ala CSS) в WPF ItemsControl?
- 17. Можно ли эмулировать C-подобный массив указателей в javascript?
- 18. __seg_fs на GCC. Можно ли эмулировать его только в программе?
- 19. Можно ли (эмулировать?) АВТОИНКРИМЕНТ на составной ПК в Sqlite?
- 20. Можно ли объединить имя переменной в XSLT?
- 21. Является ли StringBuilder коллекцией?
- 22. Как можно эмулировать пространство имен в C?
- 23. Можно ли эмулировать карточку felica с Android-устройством?
- 24. Можно ли эмулировать вспышку камеры с помощью эмулятора Android?
- 25. Можно ли эмулировать пример тестирования с помощью Gomega?
- 26. Можно ли эмулировать GPU для тестирования модулей CUDA/OpenCL?
- 27. Можно ли эмулировать щелчок элемента по его html-значению?
- 28. Android: можно ли запускать/эмулировать D-Pad KeyEvent?
- 29. Можно ли эмулировать входящие телефонные звонки на немобильное устройство
- 30. Можно ли эмулировать поведение StateT без использования пользовательских типов?
Что именно вы подразумеваете под "Emulate StringBuilder"? StringBuilder делает несколько вещей, наиболее распространенными из которых являются добавления к строкам, но он также может заменять подстроки, искать подстроку, подсчитывать ее длину и т. Д. Что конкретно вы ищете? Просто добавление? Поиск? Какие? – Welbog
Я ищу только функциональность добавления. –
Невозможно изменить значение переменной в XSLT, как только оно будет определено. Это по определению, потому что XSLT является функциональным языком. Это не означает, что нет быстрых реализаций неизменяемых строк * (даже быстрее, чем строка .NET). Узнайте больше об этом в моем ответе. –