как управлять повторяющимися тегами в xml с помощью таблицы стилей xsl

#xml #xslt

#xml #xslt

Вопрос:

привет всем, здесь я сталкиваюсь с небольшой проблемой … если предположить, что я получаю файл формата xml, в котором какой-то блок будет находиться под блоками, теги будут приходить для некоторых блоков, теги не будут повторяться, а в некоторых блоках теги будут повторяться, например: *

            <block3>
        <tag>
            <name>113</name>
            <value>FINANCIAL</value>
        </tag>

    </block3>
             <block4>

        <tag>
            <name>32A</name>
            <value>051028EUR9000,71</value>
        </tag>
        <tag>
            <name>32A</name>
            <value>051028EUR7000,71</value>
        </tag>
        <tag>
            <name>33B</name>
            <value>EUR9000,71</value>
        </tag>
        <tag>
            <name>33B</name>
            <value>EUR7000,71</value>
        </tag>
                     <tag>
            <name>71A</name>
            <value>OUR</value>
        </tag>
    </block4>
                   <xsl:for-each select ="block3/tag[name = '113']">
            <xsl:value-of select="value"/>
        </xsl:for-each>,
                   <xsl:for-each select ="block4/tag[name = '32A']">
  <xsl:value-of select="(translate(substring(value,10),',','.'))"/>,<xsl:text/>
        </xsl:for-each>
        <xsl:for-each select ="block4/tag[name = '33B']">
  <xsl:value-of select="(translate(substring(value,1),',','.'))"/>,<xsl:text/>
        </xsl:for-each>
  

*

я подготовил таблицу стилей xsl следующим образом

Вывод :

если повторяемость тегов отсутствует, это означает

ФИНАНСОВЫЙ, 9000,71, 9000,71 евро

но здесь теги xml повторяются внутри блока, поэтому я хотел бы ожидать результат, подобный

ФИНАНСОВЫЙ, 9000,71, 9000,71 евро

ФИНАНСОВЫЙ, 7000,71 евро,7000,71

Комментарии:

1. здравствуйте, может кто-нибудь, пожалуйста, дать мне несколько предложений!!!

Ответ №1:

если я вас правильно понял, вы ищете способ выводить одинаковые данные из всех <block> тегов?

Можете ли вы изменить структуру XML? Это помогло бы, если бы это были не block3 и block4, а просто несколько тегов. Тогда вы могли бы сделать что-то вроде этого:

 <xsl:template match="tag">
    <xsl:value-of select="name"/>
    <xsl:value-of select="value"/>
</xsl:template>
  

Этот шаблон будет соответствовать всем <tag> тегам. Затем вы просто применяете шаблоны поверх блоков / тегов.

<xsl:apply-templates select="block/tag"/>

Эта строка выполнит процесс для каждого тега, который является дочерним по отношению к тегу блока.

Но если вы не можете изменить структуру XML, просто сохраните шаблон и выполните:

 `<xsl:apply-templates select="block3/tag"/>
<xsl:apply-templates select="block4/tag"/>`
  

и т.д. для каждого блокаn.

На мой взгляд (исходя из того, чему меня учили), использование apply-templates (хотя новичку это понять сложнее, чем for-each) намного лучше, чем использование циклов в XSL, поскольку это язык, основанный на шаблонах.

Помогает ли это? Ваш вопрос был не очень ясен.

Комментарии:

1. спасибо, что ответили мне… ранее я получал xml, в котором были отдельные теги в каждом блоке, теперь моя проблема в том, что для нескольких целей генерации тегов они не могут снова создать весь xml, поэтому они генерируются в одном блоке с повторяемостью тегов, поэтому я привел пример, когда теги не повторяются, если я использую приведенный выше код xslt, я могу получить вывод, подобный ФИНАНСОВОМУ, 90000.71, 70000.71, EUR900.71, EUR7000.71, подобный тому, который я получал, но мне нужен вывод, подобный ФИНАНСОВОМУ ,9000,71, 900,71 евро и следующая строка ФИНАНСОВАЯ,7000,71,7000,71 евро

2. @pubby извините, я предполагаю, что английский не является вашим родным языком? В каком контексте вы находитесь в своем документе, когда пытаетесь использовать for-each? существует только один блок3 / tag[name=»113″], так что он будет выведен только один раз при вызове вашего кода. Не могли бы вы показать больше вашего XML, с которым вы работаете?

3. просто взгляните на это * <swift> <сообщение></блок3> <блок4> <тег> <имя>32A</name> <значение>051028EUR9000,71</значение> </tag> <тег> <имя>32A</name> <значение>051028EUR7000,71</значение> </tag> <тег> <имя>33B</name> <значение> EUR9000,71</ значение> </tag> <tag> <имя> 33B</name> <значение> 7000 евро,71</value> </tag> </block4> </message> </swift> да, данные блока придут только один раз, поэтому нам нужно снова выполнить makerequired