у меня есть этот XML на входе:
<root> RH03051CDSIA280524CM1490301951171
610000001 93001 G0305101700000000004575EUR270524C000000000000,00IT44
620000001001270524270524D000000000649,3450TE ITDA00DPN145
630000001001HAYS SRL/AVIS BUDGET ITALIA S.P.A./AR885265/2355070853/B2B/RCUR/OE5OA5200P4907R3
640000001EUR270524C000000000000,00
EF03051CDSIA280524CM1490301951171 0000001 0000006
RH03051CDSIA280524CM1490301951349
610000001 93001 Z0305101699000078389249USD270524C000000001320,97IT72
640000001USD270524C000000001320,97
EF03051CDSIA280524CM1490301951349 0000001 0000004
</root>
я хочу выполнить итерацию для каждой строки, начинающейся с «RH», для анализа всей многострочной строки. например, во входных данных xml у меня есть 2 строки, начинающиеся с RH:
мой xslt такой:
<xsl:stylesheet version = "1.0"
xmlns:xsl = "http://www.w3.org/1999/XSL/Transform"
xmlns:exsl = "http://exslt.org/common"
xmlns:ns = "urn:iso:std:iso:20022:tech:xsd:camt.053.001.03"
xmlns:BODY = "urn:CBI:xsd:CBIBdyBkToCstmrStmtReq.00.01.02"
xmlns:LMSG = "urn:CBI:xsd:CBIBkToCstmrStmtReqLogMsg.00.01.02"
xmlns:HE2E = "urn:CBI:xsd:CBIHdrSrv.001.07"
xmlns:HTRT = "urn:CBI:xsd:CBIHdrTrt.001.07"
xmlns:IDST = "urn:CBI:xsd:CBIIdyStmtReqLogMsg.00.01.02"
xmlns:DLST = "urn:CBI:xsd:CBIDlyStmtReqLogMsg.00.01.02"
xmlns:PRST = "urn:CBI:xsd:CBIPrdcStmtReqLogMsg.00.01.02"
xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"
xmlns:str = "http://exslt.org/strings"
xmlns:myns = "py_ns"
extension-element-prefixes = "exsl myns"
exclude-result-prefixes = "exsl ns">
<xsl:output encoding = "UTF-8" standalone = "yes" indent = "yes" method = "xml" />
<xsl:template match = "/">
<xsl:for-each select = "//text[starts-with(., ' RH')]">
<xsl:value-of select = "." />
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
но когда я сделаю:
<xsl:for-each select = "//text[starts-with(., ' RH')]">
<xsl:value-of select = "." />
я ничего не просматриваю. правильный мой код? я должен использовать библиотеку lxml, и я использую: xmlns:exsl="http://exslt.org/common" и xmlns:str="http://exslt.org/strings"
я хочу:
RH03051CDSIA280524CM1490301951171 610000001 93001 G030510170 ........... 0000001
и это:
RH03051CDSIA280524CM1490301951349 610000001 93001 ................................. EF03051CDSIA280524CM1490301951349 0000004
те же советы? Спасибо с уважением






Текст находится в одном текстовом узле, который является дочерним по отношению к корневому элементу; в XSLT 3 вы можете использовать, например.
<xsl:stylesheet xmlns:xsl = "http://www.w3.org/1999/XSL/Transform"
version = "3.0"
xmlns:xs = "http://www.w3.org/2001/XMLSchema"
exclude-result-prefixes = "#all"
expand-text = "yes">
<xsl:output method = "text"/>
<xsl:template match = "/" name = "xsl:initial-template">
<xsl:value-of select = "tokenize(root, '\n')[starts-with(., ' RH')]" separator = " "/>
</xsl:template>
</xsl:stylesheet>
Вывод: например.
RH03051CDSIA280524CM1490301951171
RH03051CDSIA280524CM1490301951349
XSLT 3 можно использовать с Python с помощью пакета saxonche.`
спасибо, но мне нужно использовать lxml... Я также использую xmlns:str = "exslt.org/strings " и xmlns:exsl = " exslt.org/common"
Используя процессор libsxlt (или любой процессор XSLT 1.0, поддерживающий функцию расширения EXSLT str:tokenize()), вы можете:
<xsl:stylesheet version = "1.0"
xmlns:xsl = "http://www.w3.org/1999/XSL/Transform"
xmlns:str = "http://exslt.org/strings"
extension-element-prefixes = "str">
<xsl:output method = "xml" version = "1.0" encoding = "utf-8" indent = "yes"/>
<xsl:template match = "/">
<strings>
<xsl:for-each select = "str:tokenize(normalize-space(root), ' ')[starts-with(., 'RH')]">
<string>
<xsl:value-of select = "."/>
</string>
</xsl:for-each>
</strings>
</xsl:template>
</xsl:stylesheet>
Желаемый результат еще не ясен. Я предполагаю (!), что вы хотите сделать что-то вроде:
<xsl:stylesheet version = "1.0"
xmlns:xsl = "http://www.w3.org/1999/XSL/Transform"
xmlns:str = "http://exslt.org/strings"
extension-element-prefixes = "str">
<xsl:output method = "xml" version = "1.0" encoding = "utf-8" indent = "yes"/>
<xsl:template match = "/">
<strings>
<xsl:for-each select = "str:split(root, ' RH')">
<string>
<xsl:value-of select = "concat('RH', .)"/>
</string>
</xsl:for-each>
</strings>
</xsl:template>
</xsl:stylesheet>
спасибо, работает, но я хочу, чтобы все многострочные строки не только: RH03051CDSIA280524CM1490301951171, я хочу до следующего "RH"
Я не уверен, что понимаю это. Во входных данных, которые вы разместили здесь, нет «многострочных строк». Это просто строки, разделенные последовательностями символов пробела. Пожалуйста, отредактируйте свой вопрос и добавьте точный результат (в виде кода), который вы ожидаете получить.
А также: Всегда ли первая строка начинается с «RH»?
я хочу: RH03051CDSIA280524CM1490301951171 610000001 93001 G030510170 ........... 0000001 и это: RH03051CDSIA280524CM1490301951349 610000001 93001 ........... ............................ EF03051CDSIA280524CM1490301951349 0000001
Пожалуйста, не публикуйте код в комментариях — вместо этого отредактируйте свой вопрос.
Я отредактировал свой ответ, но из-за отсутствия четких требований я в основном предполагаю.
именно сейчас правильно спасибо!
Какой именно результат вы хотите получить? Ваша таблица стилей объявляет
method = "xml", но не создает никакой XML-разметки. Вам нужно, чтобы строки были пронумерованы?