Невозможно l oop через указанные c узлы для каждого в xslt - PullRequest
0 голосов
/ 20 апреля 2020

У меня XML вот так:

<?xml version="1.0" encoding="utf-16"?>
<MessageParts xmlns="http://schemas.microsoft.com/dynamics/2011/01/documents/Message">
  <BankPositivePay xmlns="http://schemas.microsoft.com/dynamics/2008/01/documents/BankPositivePay">
    <BankAccountTable class="entity">
      <AccountID>GBP</AccountID>
      <CurrencyCode>GBP</CurrencyCode>
      <LedgerDimension>
        <MainAccount xmlns="http://schemas.microsoft.com/dynamics/2008/01/sharedtypes">7500000</MainAccount>
      </LedgerDimension>
      <BankChequeTable class="entity">
        <AccountID>GBP</AccountID>
        <AmountCur>444.00</AmountCur>
        <ChequeNum>7</ChequeNum>
        <RecipientAccountNum>UKV-000716</RecipientAccountNum>
        <TransDate>2017-03-10</TransDate>
        <VendTable class="entity">
          <Currency>GBP</Currency>
          <VendGroup>Stock</VendGroup>
        </VendTable>
        <CompanyInfo xsi:type="AxdEntity_CompanyInfo_CompanyInfo" class="entity" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
          <DataArea>UK</DataArea>
        </CompanyInfo>
      </BankChequeTable>
      <BankChequeTable class="entity">
        <AccountID>GBP</AccountID>
        <AmountCur>11700.00</AmountCur>
        <ChequeNum>9</ChequeNum>
        <RecipientAccountNum>UKV-000716</RecipientAccountNum>
        <TransDate>2017-04-10</TransDate>
        <VendTable class="entity">
          <Currency>GBP</Currency>
          <VendGroup>Stock</VendGroup>
        </VendTable>
        <CompanyInfo xsi:type="AxdEntity_CompanyInfo_CompanyInfo" class="entity" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
          <DataArea>UK</DataArea>
        </CompanyInfo>
      </BankChequeTable>
      <BankChequeTable class="entity">
        <AccountID>GBP</AccountID>
        <AmountCur>6394.00</AmountCur>
        <BankNegInstRecipientName>this is a test address</BankNegInstRecipientName>
        <ChequeNum>12</ChequeNum>
        <RecipientAccountNum>UKV-000716</RecipientAccountNum>
        <TransDate>2017-05-10</TransDate>
        <VendTable class="entity">
          <Currency>GBP</Currency>
          <VendGroup>Stock</VendGroup>
        </VendTable>
        <CompanyInfo xsi:type="AxdEntity_CompanyInfo_CompanyInfo" class="entity" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
          <DataArea>UK</DataArea>
        </CompanyInfo>
      </BankChequeTable>
    </BankAccountTable>
  </BankPositivePay>
</MessageParts>

Я хотел создать CSV, как показано ниже:

7, UKV-000716,444.00, 2017-03-10, 9, UKV-000716,11700.00,2017-04-10, 12, UKV-000716,6394.00,2017-05-10, это тестовый адрес

Но фактический вывод ниже:

7, UKV-000716,444.00,2017-03-10, это тестовый адрес, 7, UKV-000716,444.00,2017-03-10, это тестовый адрес, 7, UKV-000716,444.00,2017-03-10, это тестовый адрес,

Я пытаюсь l oop тег BankChequeTable, он зацикливается в VS, но показывает все строки только как первую строку .

Ниже XSLT, который я использовал:

<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="text" encoding="iso-8859-1"/>
  <xsl:strip-space elements="*" />
  <xsl:template match="/">
    <xsl:for-each select="//*[local-name() = 'BankChequeTable']">
      <xsl:value-of select="//*[local-name() = 'ChequeNum']"/>,<xsl:value-of select="//*[local-name() = 'RecipientAccountNum']"/>,<xsl:value-of select="//*[local-name() = 'AmountCur']"/>,<xsl:value-of select="//*[local-name() = 'TransDate']"/>,<xsl:value-of select="//*[local-name() = 'BankNegInstRecipientName']"/>,
    </xsl:for-each>
  </xsl:template>
</xsl:stylesheet>

Я новичок в XSLT. Может ли кто-нибудь помочь мне с этим?

Заранее спасибо.

1 Ответ

0 голосов
/ 20 апреля 2020

Вот как бы я это сделал.

<?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/XMLSchema"
    xmlns:ns1="http://schemas.microsoft.com/dynamics/2011/01/documents/Message"
    xmlns:ns2="http://schemas.microsoft.com/dynamics/2008/01/documents/BankPositivePay"
    version="1.0">

  <xsl:output method="text"/>

  <xsl:template match="/">
    <xsl:text>ChequeNum,RecipientAccountNum,AmountCur,TransDate,BankNegInstRecipientName</xsl:text>
    <xsl:text>&#xa;</xsl:text> <!-- Line Return -->
    <xsl:apply-templates select="ns1:MessageParts/ns2:BankPositivePay/ns2:BankAccountTable/ns2:BankChequeTable"/>
  </xsl:template>

  <xsl:template match="ns2:BankChequeTable">
      <xsl:value-of select="ns2:ChequeNum"/>
      <xsl:text>,</xsl:text>
      <xsl:value-of select="ns2:RecipientAccountNum"/>
      <xsl:text>,</xsl:text>
      <xsl:value-of select="ns2:AmountCur"/>
      <xsl:text>,</xsl:text>
      <xsl:value-of select="ns2:TransDate"/>
      <xsl:text>,</xsl:text>
      <xsl:value-of select="ns2:BankNegInstRecipientName"/>
      <xsl:text>&#xa;</xsl:text> <!-- Line Return -->
  </xsl:template>

</xsl:stylesheet>

Посмотрите, как это работает здесь: https://xsltfiddle.liberty-development.net/naZXVEY

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...