【问题标题】:Unable to loop through specific nodes with for each in xslt无法在 xslt 中使用 for each 循环遍历特定节点
【发布时间】:2020-08-02 22:56:30
【问题描述】:

我有这样的 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,这是一个测试地址,

我正在尝试循环 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 的初学者,有人可以帮我解决这个问题吗?

提前致谢。

【问题讨论】:

    标签: xml csv xslt


    【解决方案1】:

    我会这样做。

    <?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

    【讨论】:

    • 那是伟大的塞巴斯蒂安。非常感谢。它就像一个魅力。能否请您给我一些学习 XSLT 的最佳参考资料。
    • @KrishnaCh 我没有接受过 XSLT 方面的正式培训。我通过编写示例、阅读 StackOverflow 等来学习。我认为你应该谷歌并阅读命名空间。您也可以使用本书学习:cranesoftwrights.github.io/books/ptux/index.htm。并参考 W3C 的 XSLT 规范。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-10-15
    • 2014-09-28
    • 1970-01-01
    • 2021-07-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多