【问题标题】:Access Using XSLT to import XMLAccess 使用 XSLT 导入 XML
【发布时间】:2016-10-20 17:34:17
【问题描述】:

我目前正在编写关于 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>

【问题讨论】:

    标签: xml ms-access xslt foreach


    【解决方案1】:

    只需将&lt;Name&gt; 节点嵌套在分支&lt;xsl:for-each&gt; 中即可实现多个子节点:

    上一个

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

    最后,所有这一切都可以在没有&lt;xsl:for-each&gt; 的情况下完成,XSLT 的新手经常使用它,因此习惯于来自尚未意识到 XSLT 的递归模板映射的通用语言的迭代编程。此外,您的 Availability 目前只取自第一个 Branch 节点。下面重新创建但考虑将所有值映射到最后一个模板中对应的 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>
    

    【讨论】:

    • 非常感谢冻糕!我相信我最大的问题是使用不同类型的调用以及如何使用它们。
    猜你喜欢
    • 2019-05-09
    • 2017-06-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-29
    • 2012-07-22
    • 1970-01-01
    相关资源
    最近更新 更多