2012-08-02 94 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,所以你可以做你最終決定你需要做的事情。