XSL для каждого текста начинается с выбора в переменной

у меня есть этот 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:

  1. RH03051CDSIA280524CM1490301951171 ....
  2. RH03051CDSIA280524CM1490301951349 ....

мой 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

те же советы? Спасибо с уважением

Какой именно результат вы хотите получить? Ваша таблица стилей объявляет method = "xml", но не создает никакой XML-разметки. Вам нужно, чтобы строки были пронумерованы?

michael.hor257k 30.05.2024 14:06
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
1
53
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Текст находится в одном текстовом узле, который является дочерним по отношению к корневому элементу; в 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 = "&#10;"/>
  </xsl:template>

</xsl:stylesheet>

Вывод: например.

 RH03051CDSIA280524CM1490301951171                                                                                      
 RH03051CDSIA280524CM1490301951349  

XSLT 3 можно использовать с Python с помощью пакета saxonche.`

спасибо, но мне нужно использовать lxml... Я также использую xmlns:str = "exslt.org/strings " и xmlns:exsl = " exslt.org/common"

Catanzaro 30.05.2024 13:56
Ответ принят как подходящий

Используя процессор 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"

Catanzaro 30.05.2024 14:12

Я не уверен, что понимаю это. Во входных данных, которые вы разместили здесь, нет «многострочных строк». Это просто строки, разделенные последовательностями символов пробела. Пожалуйста, отредактируйте свой вопрос и добавьте точный результат (в виде кода), который вы ожидаете получить.

michael.hor257k 30.05.2024 14:18

А также: Всегда ли первая строка начинается с «RH»?

michael.hor257k 30.05.2024 14:20

я хочу: RH03051CDSIA280524CM1490301951171 610000001 93001 G030510170 ........... 0000001 и это: RH03051CDSIA280524CM1490301951349 610000001 93001 ........... ............................ EF03051CDSIA280524CM1490301951349 0000001

Catanzaro 30.05.2024 14:20

Пожалуйста, не публикуйте код в комментариях — вместо этого отредактируйте свой вопрос.

michael.hor257k 30.05.2024 14:21

Я отредактировал свой ответ, но из-за отсутствия четких требований я в основном предполагаю.

michael.hor257k 30.05.2024 14:32

именно сейчас правильно спасибо!

Catanzaro 30.05.2024 14:37

Другие вопросы по теме