[英]Access Using XSLT to import XML
I'm currently working on new code on Access that I can't seem to wrap my head around. 我目前正在开发Access上的新代码,但似乎无法解决。 I'm very new to xslt and I understand the basic concepts of "For-Each" but I am still having trouble with it.
我是xslt的新手,我了解“ For-Each”的基本概念,但仍然遇到麻烦。 I was hoping if some of you guys can help me understand why my code isn't working how it is suppose to.
我希望你们中的某些人能帮助我理解为什么我的代码无法正常运行。
What I was hoping for is to print all of this in tables in Access with having all Branch names in separate rows. 我希望将所有这些分支名称都放在单独的行中,以在Access的表中打印所有这些内容。 Currently I have the branch names printed in a single row.
目前,我将分支名称打印在一行中。
Anything helps. 任何帮助。 Thank you guys!
感谢大伙们!
XSLT Code 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 Code: 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>
Simply nest your <Name>
node within the Branch <xsl:for-each>
to achieve multiple child nodes: 只需将您的
<Name>
节点嵌套在Branch <xsl:for-each>
即可实现多个子节点:
Previous 以前
<Name>
<xsl:for-each select="Branch">
<xsl:value-of select="@Name"/>
</xsl:for-each>`
</Name>
Updated 更新
<xsl:for-each select="Branch">
<Name>
<xsl:value-of select="@Name"/>
</Name>
</xsl:for-each>
Output 输出量
<?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>
However, in MS Access, like most databases, you require distinct column names, so consider suffixing with a number, namely the node's position: 但是,在MS Access中,像大多数数据库一样,您需要使用不同的列名,因此请考虑在数字后缀,即节点的位置:
<xsl:for-each select="Branch">
<xsl:element name="{concat('Name', position())}">
<xsl:value-of select="@Name"/>
</xsl:element>
</xsl:for-each>
Output 输出量
<?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>
Finally, all this can be done without <xsl:for-each>
which often is regularly used by newcomers in XSLT so used to iterative programming coming from general purpose languages not yet aware of the recursive template mapping of XSLT. 最后,无需
<xsl:for-each>
即可完成所有这些操作, <xsl:for-each>
经常由XSLT的新手经常使用,因此习惯于对尚不了解XSLT递归模板映射的通用语言进行的迭代编程。 Also, your Availability currently only takes from first Branch node. 另外,您的可用性当前仅从第一个分支节点获取。 Below re-creates but think about mapping all values with corresponding Branch in last template:
下面重新创建,但考虑将所有值映射到最后一个模板中的对应Branch :
Alternative 另类
<?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.