簡體   English   中英

使用XSLT進行訪問以導入XML

[英]Access Using XSLT to import XML

我目前正在開發Access上的新代碼,但似乎無法解決。 我是xslt的新手,我了解“ For-Each”的基本概念,但仍然遇到麻煩。 我希望你們中的某些人能幫助我理解為什么我的代碼無法正常運行。

我希望將所有這些分支名稱都放在單獨的行中,以在Access的表中打印所有這些內容。 目前,我將分支名稱打印在一行中。

任何幫助。 感謝大伙們!

XSLT代碼

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes"/>
<xsl:template match="/">
<ING_PNA_Import>
  <xsl:for-each select="PNAResponse/PriceAndAvailability">
    <Import>

      <Test>
        <SKU>
          <xsl:value-of select="@SKU"/>
        </SKU>
        <VendorNumber>
          <xsl:value-of select="VendorNumber"/>
        </VendorNumber>
        <Price>
          <xsl:value-of select="Price"/>
        </Price>
        <MPN>
          <xsl:value-of select="ManufacturerPartNumber"/>
        </MPN>

          <ID>
            <xsl:value-of select="Branch/@ID"/>
            <xsl:text>
            </xsl:text>
        </ID>

        <Name>

          <xsl:for-each select="Branch">
            <xsl:value-of select="@Name"/>
          </xsl:for-each>`
        </Name>

        <Availability>
          <xsl:value-of select="Branch/Availability"/>
        </Availability>

      </Test>

    </Import>
  </xsl:for-each>
</ING_PNA_Import>

XML代碼:

<?xml version="1.0" encoding="iso-8859-1"?>
<PNAResponse>
<Version>2.0</Version>
<TransactionHeader>
  <SenderID>YOU</SenderID>
  <ReceiverID>MD</ReceiverID>
  <ErrorStatus ErrorNumber=""></ErrorStatus>
  <DocumentID></DocumentID>
  <TransactionID></TransactionID>
</TransactionHeader>

<PriceAndAvailability SKU="100150" Quantity="1">
  <Price>21.21</Price>
  <SpecialPriceFlag></SpecialPriceFlag>
  <ManufacturerPartNumber>TEST1234</ManufacturerPartNumber>
  <ManufacturerPartNumberOccurs></ManufacturerPartNumberOccurs>
  <VendorNumber>123X</VendorNumber>
  <Description>Cool Item</Description>
  <ReserveInventoryFlag>Y</ReserveInventoryFlag>
  <AvailableRebQty>0</AvailableRebQty>

  <Branch Name="Town1" ID="01">
    <Availability>8</Availability>
    <OnOrder>0</OnOrder>
    <ETADate></ETADate>
  </Branch>

  <Branch Name="Town2" ID="02">
    <Availability>8</Availability>
    <OnOrder>0</OnOrder>
    <ETADate></ETADate>
  </Branch>

  <Branch Name="Town3" ID="03">
    <Availability>6</Availability>
    <OnOrder>5</OnOrder>
    <ETADate></ETADate>
  </Branch>

  <Branch Name="Town4" ID="04">
    <Availability>5</Availability>
    <OnOrder>5</OnOrder>
    <ETADate></ETADate>
  </Branch>

  <Branch Name="Town5" ID="05">
    <Availability>10</Availability>
    <OnOrder>0</OnOrder>
    <ETADate></ETADate>
  </Branch>

  <UPC>123456789012345</UPC>
  <CustomerPartNumber></CustomerPartNumber>

只需將您的<Name>節點嵌套在Branch <xsl:for-each>即可實現多個子節點:

以前

  <Name>
     <xsl:for-each select="Branch">
        <xsl:value-of select="@Name"/>
     </xsl:for-each>`
  </Name>

更新

  <xsl:for-each select="Branch">
     <Name>
        <xsl:value-of select="@Name"/>
     </Name>
  </xsl:for-each>

輸出量

<?xml version='1.0' encoding='UTF-8'?>
<ING_PNA_Import>
  <Import>
    <Test>
      <SKU>100150</SKU>
      <VendorNumber>123X</VendorNumber>
      <Price>21.21</Price>
      <MPN>TEST1234</MPN>
      <ID>01</ID>
      <Name>Town1</Name>
      <Name>Town2</Name>
      <Name>Town3</Name>
      <Name>Town4</Name>
      <Name>Town5</Name>
      <Availability>8</Availability>
    </Test>
  </Import>
</ING_PNA_Import>

但是,在MS Access中,像大多數數據庫一樣,您需要使用不同的列名,因此請考慮在數字后綴,即節點的位置:

<xsl:for-each select="Branch">
   <xsl:element name="{concat('Name', position())}">
      <xsl:value-of select="@Name"/>
   </xsl:element>
</xsl:for-each>

輸出量

<?xml version='1.0' encoding='UTF-8'?>
<ING_PNA_Import>
  <Import>
    <Test>
      <SKU>100150</SKU>
      <VendorNumber>123X</VendorNumber>
      <Price>21.21</Price>
      <MPN>TEST1234</MPN>
      <ID>01</ID>
      <Name1>Town1</Name1>
      <Name2>Town2</Name2>
      <Name3>Town3</Name3>
      <Name4>Town4</Name4>
      <Name5>Town5</Name5>
      <Availability>8</Availability>
    </Test>
  </Import>
</ING_PNA_Import>

最后,無需<xsl:for-each>即可完成所有這些操作, <xsl:for-each>經常由XSLT的新手經常使用,因此習慣於對尚不了解XSLT遞歸模板映射的通用語言進行的迭代編程。 另外,您的可用性當前僅從第一個分支節點獲取。 下面重新創建,但考慮將所有值映射到最后一個模板中的對應Branch

另類

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

  <xsl:template match="/PNAResponse">
    <ING_PNA_Import>            
      <xsl:apply-templates select="PriceAndAvailability"/>
    </ING_PNA_Import>
  </xsl:template>

  <xsl:template match="PriceAndAvailability">        
    <Import>
      <Test>
        <SKU><xsl:value-of select="@SKU"/></SKU>
        <VendorNumber><xsl:value-of select="VendorNumber"/></VendorNumber>
        <Price><xsl:value-of select="Price"/></Price>
        <MPN><xsl:value-of select="ManufacturerPartNumber"/></MPN>
        <ID><xsl:value-of select="Branch/@ID"/></ID>            
        <xsl:apply-templates select="Branch"/>
        <xsl:copy-of select="Branch[1]/Availability"/>
      </Test>
    </Import>
  </xsl:template>

  <xsl:template match="Branch">
    <xsl:element name="{concat('Name', position())}">
       <xsl:value-of select="@Name"/>
    </xsl:element>                
  </xsl:template>

</xsl:stylesheet>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM