2016-10-20 2 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> 

는 MS 액세스를에,

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

그러나

<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> 
     <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 select="Branch"> 
    <xsl:element name="{concat('Name', position())}"> 
     <xsl:value-of select="@Name"/> 
    </xsl:element> 
</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

관련 문제