если теги повторно отображаются в xml, то эти данные нужно получать индивидуально, используя xslt - PullRequest
0 голосов
/ 02 ноября 2011

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

вот мой xml:

<local>
<message>       
    <block4>            
        <tag>
            <name>72</name>
            <value>ALW103111102000001</value>
        </tag>          
        <tag>
            <name>70</name>
            <value>TESTING CITI BANK EFT9</value>
        </tag>
        <tag>
            <name>71A</name>
            <value>OUR</value>
        </tag>
        <tag>
            <name>72</name>
            <value>ipubby</value>
        </tag>
    </block4>       
</message>
</local>

вот мой xslt:

<?xml version="1.0"?>
   <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text"/>
<xsl:template match="/">
    <xsl:for-each select="local/message">
                 <xsl:for-each select ="block4/tag[name = '72']">
            <xsl:value-of select="value"/>
        </xsl:for-each>,<xsl:text/> 
                    <xsl:for-each select ="block4/tag[name = '72']">
            <xsl:value-of select="value"/>
        </xsl:for-each>
       </xsl:for-each>
   </xsl:template>
     </xsl:stylesheet>

требуется вывод:

ALW103111102000001, ipubby

1 Ответ

0 голосов
/ 02 ноября 2011

Похоже, вы спрашиваете, что вы хотите сопоставить все элементы tag с name из 72 и объединить значения в одну строку.

В данный момент вы вкладываете свои xsl: for-each операторы, в результате чего элементы выбираются дважды, а ваша строка вывода дублируется.

Что вам нужно сделать, это просто выбрать первый тег, например, так:

<xsl:value-of select="block4/tag[name = '72'][1]/value"/>

И тогда вы можете получить оставшиеся теги примерно так ...

<xsl:for-each select="block4/tag[name = '72'][position() > 1]">

Обратите внимание, что было бы предпочтительно использовать xsl: apply-templates для сопоставления узлов, а не xsl: for-each .

Вот полный XSLT

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
   <xsl:output method="text"/>

   <xsl:template match="/">
      <xsl:apply-templates select="local/message"/>
   </xsl:template>

   <xsl:template match="message">
      <xsl:value-of select="block4/tag[name = '72'][1]/value"/>
      <xsl:apply-templates select="block4/tag[name = '72'][position() &gt; 1]"/>
   </xsl:template>

   <xsl:template match="tag">
      <xsl:text>,</xsl:text>
      <xsl:value-of select="value"/>
   </xsl:template>
</xsl:stylesheet>

При применении к заданному вами входному XML, вывод будет следующим:

ALW103111102000001,ipubby
...