2012-08-02 66 views
0

我正在从Web服务获取XML响应。我需要使用XSLT转换此XML并将数据插入到数据库中。示例XML响应如下。如何使用XSLT声明数组

<?xml version="1.0" encoding="UTF-8"?> 
<SOAP-ENV:Body> 
<ttordhdr> 
<ttordhdrRow> 
    <OH-ORDNBR>123</OH-ORDNBR> 
    <OH-ORDTYPE>B</OH-ORDTYPE> 
    <OH-DSTNFLR></OH-DSTNFLR> 
    <OH-RCVTYP>P</OH-RCVTYP> 
    </ttordhdrRow> 
    <ttordhdrRow> 
    <OH-ORDNBR>456</OH-ORDNBR> 
    <OH-ORDTYPE>c</OH-ORDTYPE> 
    <OH-DSTNFLR></OH-DSTNFLR> 
    <OH-RCVTYP>P</OH-RCVTYP> 
    </ttordhdrRow> 
</ttordhdr> 
<ttordline> 
<ttordlineRow> 
    <OH-ORDNBR>123</OH-ORDNBR> 
    <OL-ORDLNNBR>1</OL-ORDLNNBR> 
    <OL-ITEMTYPE>true</OL-ITEMTYPE> 
    <OL-QTY>10</OL-QTY> 
    <OL-DISP></OL-DISP> 
    </ttordlineRow> 
    <ttordlineRow> 
    <OH-ORDNBR>123</OH-ORDNBR> 
    <OL-ORDLNNBR>1</OL-ORDLNNBR> 
    <OL-ITEMTYPE>true</OL-ITEMTYPE> 
    <OL-QTY>10</OL-QTY> 
    <OL-DISP></OL-DISP> 
    </ttordlineRow> 
    </ttordline> 
</SOAP-ENV:Body> 

我的要求是选择所有/从哪里是'B'。并将其与/映射并获得相应的。

我想我可以使用数组来存储和执行映射。请帮我在这

+0

你能解释一下你的意思吗?你的意思是说,在任何文本中有'B'响应的地方,你想要找到它并将它与发现的元素一起存储?所以 B 会返回OH-ORDTYPE?然后你想用它做什么?一个XPath会给你那个(// * [text()='B']) – Woody 2012-08-02 11:27:45

+0

实际上我想要做的是从'ttordhdrRow'中选择所有的'OH-ORDNB',其中'OH-ORDTYPE'= B.然后将'OH-ORDNBR'与'ttordlineRow/OH-ORDNBR'映射并从'ttordhdrRow'获得相应的'OH-ORDNBR'。 – user1571041 2012-08-02 11:46:47

+0

首先你的xml文件格式错误。 的订单是互换的。 – CSharp 2012-08-02 12:09:16

回答

0

您还没有指定要使用的数据做什么,但下面的XSLT 1.0模板:

<?xml version="1.0" encoding="utf-8"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"> 

<xsl:output method="xml" indent="yes"/> 

<xsl:template match="/"> 
    <xsl:apply-templates select="//ttordhdr/ttordhdrRow[OH-ORDTYPE[text()='B']]/OH-ORDNBR"/> 
</xsl:template> 

<xsl:template match="OH-ORDNBR"> 
    <xsl:variable name="val" select="text()"/> 
    <xsl:apply-templates select="//ttordline/ttordlineRow[OH-ORDNBR = $val]"/> 
</xsl:template> 

<xsl:template match="ttordlineRow"> 
    <!-- do something here --> 
    For OH-ORDNBR <xsl:value-of select="OH-ORDNBR"/> 
</xsl:template> 
</xsl:stylesheet> 

当应用到您的数据提供了:

<?xml version="1.0" encoding="utf-8"?> 
    For OH-ORDNBR 123 
    For OH-ORDNBR 123 

显然,它本身并没有太多的好处,但是在底部的模板中(它在这里表示做某件事),你会得到每一个匹配的ttordlineRow,所以你可以做你最终决定你需要做的事情。