2016-10-20 76 views
0

我目前正在研究Access上的新代碼,但似乎無法包裝我的頭。我對xslt非常陌生,並且理解「For-Each」的基本概念,但我仍然遇到問題。我希望如果你們中的一些人能夠幫助我理解爲什麼我的代碼不能正常工作。訪問使用XSLT導入XML

我所希望的是在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>123456789</UPC> 
    <CustomerPartNumber></CustomerPartNumber> 

回答

0

簡單地窩科<xsl:for-each>在您<Name>節點,實現多重柒d節點:

上一頁

<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艾策斯S,最喜歡的數據庫,你需要不同的列名,因此考慮用一個號碼,即該節點的位置後面添加:

<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>完成這在XSLT中經常被新手使用,所以習慣於通用語言的迭代編程,這些語言還沒有意識到XSLT的遞歸模板映射。另外,你的可用性目前只需要從第一個分支節點。下面重新創建,但想想在最後一個模板相應分公司映射的所有值:

替代

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

謝謝你這麼多芭菲!我相信我最大的問題是使用不同類型的呼叫以及如何使用它們。 – Pang