Как вывести строку, являющуюся подстрокой в ​​цикл XSLT - PullRequest
0 голосов
/ 06 ноября 2019

Я работал над некоторым кодом о том, как отображать или выводить строку / код с разделителем в виде строки, который вставляется в цикл. Глядя на часть XML, узел имеет три значения <vb:ecodewithamt>. Проблема в том, что я не могу показать другие значения <vb:ecodewithamt>, когда пытаюсь его запустить. Также после того, как я получу слово / код с подстрокой, я преобразую их в эквивалентный 'Enumcode', когда это AAA, должно быть = 3, если BBB должно быть = 6 и если CCC = 7. Я успешно получил преобразование <vb:ABase> и <vb:AcBase>, то есть 'Enumcode' 1 и 2 соответственно. Заранее спасибо!

Вот мой XSLT-код, я пробовал это решение / код

    <? xml version='1.0' encoding='UTF-8' ?>
    <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                 xmlns:xs="http://www.w3.org/2001/XSL/XMLSchema" exclude-result-prefixes="xs" version="2.0"
                 xmlns:vb="urn:com.vb/pfile"
                 xmlns:xsi="http://www.w3.org/2001/XSL/XMLSchema-instance" >


<xsl:output method="text" />
    <xsl:template match="/" />

         <!-- LineBreak and Delimiter -->
    <xsl:variable select="'&#x0d;&#x0a;'" name="LINE_FEED"/>
    <xsl:variable select="'|'" name="PIPE"/>

       <!-- Enum codes -->

    <xsl:variable select="'1'" name="Enumcode1"/>
    <xsl:variable select="'2'" name="Enumcode2"/>
    <xsl:variable select="'3'" name="Enumcode3"/>
    <xsl:variable select="'6'" name="Enumcode6"/>
    <xsl:variable select="'7'" name="Enumcode7"/>

        <!-- This is the header -->

    <xsl:text>EMPID</xsl:text>
       <xsl:value-of select ="$PIPE"/>
    <xsl:text>EPtypeID</xsl:text>
       <xsl:value-of select ="$PIPE"/>
    <xsl:text>EPAmt</xsl:text>
       <xsl:value-of select ="$PIPE"/>
    <xsl:text>EPPeriod</xsl:text>
       <xsl:value-of select ="$PIPE"/>
    <xsl:text>CurrID</xsl:text>
       <xsl:value-of select ="$PIPE"/>
       <xsl:value-of select ="$LINE_FEED"/>


    <xsl:variable select="vb:EMPID" name="EmployeeID"/>
    <xsl:variable select="vb:work_group/vb:ABase" name="AnBase"/>
    <xsl:variable select="vb:work_group/vb:AcBase" name="AccBase"/>
    <xsl:variable select="vb:work_group/vb:PPeriod" name="PayPd"/>
 <xsl:variable select="vb:work_group/vb:Currency/vb:ID[@vb:type='Currency_ID']" name="CurrencyID"/>

    <xsl:if test="$AnBase != ' '">

        <EMPLID>
            <xsl:value-of select ="$EmployeeID"/>
        </EMPLID>
            <xsl:value-of select ="$PIPE"/>
        <EARN1>
            <xsl:value-of select ="$Enumcode1"/>
        </EARN1>
            <xsl:value-of select ="$PIPE"/>
        <Amount>
            <xsl:value-of select ="$AnBase"/>
        </Amount>
            <xsl:value-of select ="$PIPE"/>
        <PayPeriod>
            <xsl:value-of select ="$PayPd"/>
        </PayPeriod>
            <xsl:value-of select ="$PIPE"/>
        <Currency>
            <xsl:value-of select ="$CurrencyID"/>
        </Currency>
            <xsl:value-of select ="$LINE_FEED"/>
    </xsl:if>



<xsl:if test="$AccBase != ' '">

        <EMPLID>
            <xsl:value-of select ="$EmployeeID"/>
        </EMPLID>
            <xsl:value-of select ="$PIPE"/>
        <EARN1>
            <xsl:value-of select ="$Enumcode1"/>
        </EARN1>
            <xsl:value-of select ="$PIPE"/>
        <Amount>
            <xsl:value-of select ="$AccBase"/>
        </Amount>
            <xsl:value-of select ="$PIPE"/>
        <PayPeriod>
            <xsl:value-of select ="$PayPd"/>
        </PayPeriod>
            <xsl:value-of select ="$PIPE"/>
        <Currency>
            <xsl:value-of select ="$CurrencyID"/>
        </Currency>
            <xsl:value-of select ="$LINE_FEED"/>
    </xsl:if>

    <xsl:for-each select"vb:earn_group">
        <EMPLID>
            <xsl:value-of select ="$EmployeeID"/>
        </EMPLID>

           <!-- Here is the part of my substring -->

        <EARN1>
           <xsl:choose>
                     <xsl:when test="substring(vb:ecodewithamt,1,3 = 'AAA' ">
            <xsl:value-of select ="$Enumcode3"/>
           </xsl:when>
           <xsl:when test="substring(vb:ecodewithamt,1,3 = 'BBB' ">
            <xsl:value-of select ="$Enumcode6"/>
           </xsl:when>
           <xsl:when test="substring(vb:ecodewithamt,1,3 = 'CCC' ">
            <xsl:value-of select ="$Enumcode7"/>
           </xsl:when>
           <xsl:otherwise>
                <xsl:text></xsl:text>
           </xsl:otherwise>
        </EARN1>

            <!-- End of substring -->

        <PayPeriod>
            <xsl:value-of select ="$PayPd"/>
        </PayPeriod>
            <xsl:value-of select ="$PIPE"/>
        <Currency>
            <xsl:value-of select ="$CurrencyID"/>
        </Currency>
            <xsl:value-of select ="$LINE_FEED"/>
        </xsl:for-each>
    </xsl:for-each>
<xsl:stylesheet>

Вот пример XML:

<? xml version='1.0' encoding='UTF-8' ?>

<vb:Report_info xmlns:vb="urn:com.vb/pfile">
    <vb:Report_start>
        <vb:EMPID>1111</vb:EMPID>
        <vb:work_group>
            <vb:ABase>3333</vb:ABase>
            <vb:AcBase>2222</vb:AcBase>
            <vb:PPeriod>AY</vb:PPeriod>
            <vb:Currency vb:Descriptor="XXX">
                <vb:ID vb:type="Currency_ID">XXX</vb:ID>
            </vb:Currency>
        </vb:work_group>
        <vb:earn_group>
            <vb:ecodewithamt>AAA|9999</vb:ecodewithamt>
            <vb:ecodewithamt>BBB|8888</vb:ecodewithamt>
            <vb:ecodewithamt>CCC|7777</vb:ecodewithamt>
        </vb:earn_group>
    </vb:Report_start>
</vb:Report_info>

Я получаю:

EMPID|EPtypeID|EPAmt|EPPeriod|CurrID

1111|1|3333|AY|XXX
1111|2|2222|AY|XXX
1111|3

Вывод должен быть:

1111|1|3333|AY|XXX
1111|2|2222|AY|XXX
1111|3|9999|AY|XXX
1111|6|8888|AY|XXX
1111|7|7777|AY|XXX

1 Ответ

0 голосов
/ 07 ноября 2019

Если я полностью проигнорирую ваш код и сконцентрируюсь исключительно на заданном вводе и ожидаемом выводе, я получу:

XSLT 1.0

<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:vb="urn:com.vb/pfile">
<xsl:output method="text" />
<xsl:strip-space elements="*"/>

<xsl:template match="vb:Report_start">
    <xsl:variable name="line-begin">
        <xsl:value-of select="vb:EMPID"/>
        <xsl:text>|</xsl:text>
    </xsl:variable>

    <xsl:variable name="line-end">
        <xsl:text>|</xsl:text>
        <xsl:value-of select="vb:work_group/vb:PPeriod"/>
        <xsl:text>|</xsl:text>
        <xsl:value-of select="vb:work_group/vb:Currency/vb:ID[@vb:type='Currency_ID']"/>
        <xsl:text>&#13;&#10;</xsl:text>
    </xsl:variable>

    <!-- PART A -->
    <xsl:value-of select="$line-begin"/>
    <xsl:text>1|</xsl:text>
    <xsl:value-of select="vb:work_group/vb:ABase"/>
    <xsl:value-of select="$line-end"/>

    <xsl:value-of select="$line-begin"/>
    <xsl:text>2|</xsl:text>
    <xsl:value-of select="vb:work_group/vb:AcBase"/>
    <xsl:value-of select="$line-end"/>

    <!-- PART B -->
    <xsl:for-each select="vb:earn_group/vb:ecodewithamt">
        <xsl:variable name="code" select="substring-before(., '|')" />
        <xsl:value-of select="$line-begin"/>
        <xsl:choose>
            <xsl:when test="$code='AAA'">3</xsl:when>
            <xsl:when test="$code='BBB'">6</xsl:when>
            <xsl:when test="$code='CCC'">7</xsl:when>
        </xsl:choose>
        <xsl:text>|</xsl:text>
        <xsl:value-of select="substring-after(., '|')" />
        <xsl:value-of select="$line-end"/>
    </xsl:for-each>
</xsl:template>

</xsl:stylesheet>

Некоторые части этого основаны на догадках - тем не менее, результат при применении к вашему примеру XML:

1111|1|3333|AY|XXX
1111|2|2222|AY|XXX
1111|3|9999|AY|XXX
1111|6|8888|AY|XXX
1111|7|7777|AY|XXX
...