2015-02-01 5 views
-1

XSLT: Письменного мой XSLT, как это, но я не получаю требуемый выход, как показано ниже, что означает, что я хочу Перебери каждую запись и получить frontimagefilename и rearimagefilename для каждого чека.XSLT: Объединить и выберите элемент

<xsl:template name="ChequeDetailsTemplate"> 
       <xsl:param name ="vItemcurrIndx" /> 
      <xsl:variable name ="x" select ="$allRecs[$vItemcurrIndx]/Content/*" />    
     <xsl:call-template name="loop"> 
      <xsl:with-param name="i" select="1"/> 
      <xsl:with-param name="limit" select="$x/NumberOfCheques"/> 
      <xsl:with-param name="vItemcurrIndx" select="position()"></xsl:with-param> 
     </xsl:call-template> 
    </xsl:template> 
    <xsl:template name="loop"> 
     <xsl:param name="i"/> 
     <xsl:param name="limit"/> 
     <xsl:param name ="vItemcurrIndx" /> 
     <xsl:variable name ="y" select ="$allRecs[$vItemcurrIndx]/Content/*" /> 
      <xsl:if test="$i &lt;= $limit"> 
        <Check> 
        <CheckAmount><xsl:value-of select="concat(./CourtesyAmount,$i)"/> </CheckAmount> 
        <FrontImage><xsl:value-of select="concat(./FrontImageFilename,$i)"/></FrontImage> 
        <RearImage><xsl:value-of select="concat(./RearImageFilename,$i)"/></RearImage> 
        </Check> 
      <xsl:call-template name="loop"> 
       <xsl:with-param name="i" select="$i+1"/> 
       <xsl:with-param name="limit" select="$limit"/> 
      </xsl:call-template> 
      </xsl:if> 
    </xsl:template> 

выход ищет:

-<Check><CheckAmount>300</CheckAmount><Codeline><006474< :########## 12345678<</Codeline><FrontImage>C:\Jan292015\archive (1) - Copy\archive\BIN\TempChequeImages\CHQNCR-2VD8NP348TD20150129135318f001.tif</FrontImage><RearImage>C:\Jan292015\archive (1) - Copy\archive\BIN\TempChequeImages\CHQNCR-2VD8NP348TD20150129135318r001.tif</RearImage><CourtesyAmount>300</CourtesyAmount></Check>-<Check><CheckAmount>300</CheckAmount><Codeline><006474< :########## 12345678<</Codeline><FrontImage>C:\Jan292015\archive (1) - Copy\archive\BIN\TempChequeImages\CHQNCR-2VD8NP348TD20150129135320f002.tif</FrontImage><RearImage>C:\Jan292015\archive (1) - Copy\archive\BIN\TempChequeImages\CHQNCR-2VD8NP348TD20150129135320r002.tif</RearImage><CourtesyAmount>300</CourtesyAmount></Check> 

Но выход, который им получить сейчас:

-<Check><CheckAmount>1</CheckAmount><FrontImage>1</FrontImage><RearImage>1</RearImage></Check>-<Check><CheckAmount>2</CheckAmount><FrontImage>2</FrontImage><RearImage>2</RearImage></Check> 
+0

Где мы можем найти входной XML, который вы использовали? –

+0

Первая проблема заключается в использовании 'call-template'. [Посмотрите на шаблоны push-style, которые вместо этого используют 'apply-template') (http://www.ibm.com/developerworks/library/x-xdpshpul.html). –

+0

Спасибо за быстрые ответы. Мой вход что-то вроде этого: \t R: \ bin_simulated \ Images \ TempChequeImages \ CHQWINSK185227-B6R20150202031835f002.bmp \t R: \ bin_simulated \ Images \ TempChequeImages \ CHQWINSK185227-B6R20150202031835r002.BMP \t None \t None \t 2

ответ

1

Если я угадал правильно, ваш вход выглядит что-то вроде (!) это:

<ChqDepAppSrvChequeScanComplete> 
    <CourtesyAmount1>100</CourtesyAmount1> 
    <FrontImageFilename1 t="String">R:\bin_simulated\Images\TempChequeImages\100f001.bmp</FrontImageFilename1> 
    <RearImageFilename1 t="String">R:\bin_simulated\Images\TempChequeImages\100r001.bmp</RearImageFilename1> 
    <RefuseReason1 t="String">None</RefuseReason1> 

    <CourtesyAmount2>200</CourtesyAmount2> 
    <FrontImageFilename2 t="String">R:\bin_simulated\Images\TempChequeImages\200f002.bmp</FrontImageFilename2> 
    <RearImageFilename2 t="String">R:\bin_simulated\Images\TempChequeImages\200r002.bmp</RearImageFilename2> 
    <RefuseReason2 t="String">None</RefuseReason2> 

    <NumberOfCheques t="Int32">2</NumberOfCheques> 
</ChqDepAppSrvChequeScanComplete> 

Ваша ошибка состоит в том, как вы построили это выражение:

<xsl:value-of select="concat(./CourtesyAmount,$i)"/> 

Там нет <CourtesyAmount> узла в вашем входе, так что вы не конкатенации ничего и $ я, что приводит к текущей стоимости $ я.

То, что вы действительно хотите сделать здесь получить значение от узла, чье имя является конкатенация строки «CourtesyAmount» и текущей стоимостью $ я. Нечто подобное:

XSLT-1,0

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/> 

<xsl:template match="/ChqDepAppSrvChequeScanComplete"> 
    <output> 
     <xsl:call-template name="loop"> 
      <xsl:with-param name="limit" select="NumberOfCheques"/> 
     </xsl:call-template> 
    </output> 
</xsl:template> 

<xsl:template name="loop"> 
    <xsl:param name="i" select="1"/> 
    <xsl:param name="limit"/> 
    <xsl:if test="$i &lt;= $limit"> 
     <Check> 
      <CheckAmount> 
       <xsl:value-of select="*[local-name()=concat('CourtesyAmount', $i)]"/> 
      </CheckAmount> 
      <FrontImage> 
       <xsl:value-of select="*[local-name()=concat('FrontImageFilename', $i)]"/> 
      </FrontImage> 
      <RearImage> 
       <xsl:value-of select="*[local-name()=concat('RearImageFilename', $i)]"/> 
      </RearImage> 
     </Check> 
     <xsl:call-template name="loop"> 
      <xsl:with-param name="i" select="$i+1"/> 
      <xsl:with-param name="limit" select="$limit"/> 
     </xsl:call-template> 
    </xsl:if> 
</xsl:template> 

</xsl:stylesheet> 

, который при нанесении на входе выше будет результате в:

<?xml version="1.0" encoding="UTF-8"?> 
<output> 
    <Check> 
     <CheckAmount>100</CheckAmount> 
     <FrontImage>R:\bin_simulated\Images\TempChequeImages\100f001.bmp</FrontImage> 
     <RearImage>R:\bin_simulated\Images\TempChequeImages\100r001.bmp</RearImage> 
    </Check> 
    <Check> 
     <CheckAmount>200</CheckAmount> 
     <FrontImage>R:\bin_simulated\Images\TempChequeImages\200f002.bmp</FrontImage> 
     <RearImage>R:\bin_simulated\Images\TempChequeImages\200r002.bmp</RearImage> 
    </Check> 
</output> 

Примечание:

реальный проблема здесь вход. Его нельзя отформатировать таким образом. Все было бы гораздо проще, если человек перед вами сделали правильную работу и предоставил вам хорошо структурированный XML, например:

<ChqDepAppSrvChequeScanComplete> 
    <NumberOfCheques t="Int32">2</NumberOfCheques> 
    <Cheque> 
     <CourtesyAmount>100</CourtesyAmount> 
     <FrontImageFilename t="String">R:\bin_simulated\Images\TempChequeImages\100f001.bmp</FrontImageFilename> 
     <RearImageFilename t="String">R:\bin_simulated\Images\TempChequeImages\100r001.bmp</RearImageFilename> 
     <RefuseReason t="String">None</RefuseReason> 
    </Cheque> 
    <Cheque> 
     <CourtesyAmount>200</CourtesyAmount> 
     <FrontImageFilename t="String">R:\bin_simulated\Images\TempChequeImages\200f002.bmp</FrontImageFilename> 
     <RearImageFilename t="String">R:\bin_simulated\Images\TempChequeImages\200r002.bmp</RearImageFilename> 
     <RefuseReason t="String">None</RefuseReason> 
    </Cheque> 
</ChqDepAppSrvChequeScanComplete> 

ни с этого пронумерованными узлами нонсенса.

Смежные вопросы