2013-07-12 61 views
1

此代碼沒有給出想要的結果。請幫助。此代碼沒有給出所需的結果。請幫助。 此代碼沒有給出想要的結果。請幫助。訪問存儲在xslt變量中的xml

<xsl:template match="/"> 
<xsl:variable name="Resp"> 
    <Response> 
     <Status> 
      <A></A> 
     </Status> 
     <RespRec> 
      <Data> 
       <A1>gmailcom</A1> 
       <B1>YES</B1> 
       <C1>PRIVACY</C1> 
       <D1>00</D1> 
      </Data> 
      <Data> 
       <A1>Ymailcom</A1> 
       <B1>DES</B1> 
       <C1>TYPE</C1> 
       <D1>01</D1> 
      </Data> 
     </RespRec> 
    </Response> 
</xsl:variable> 
<xsl:element name="Response"> 

    <xsl:for-each select="$Resp/Response/RespRec/Data"> 
     <ABCD> <!-- It can repeat as many as Data element is there --> 
      <A1> 
       <xsl:value-of select="$Resp/Response/RespRec/Data/A1" /> 
      </A1> 
      <B1> 
       <xsl:value-of select="$Resp/Response/RespRec/Data/B1" /> 
      </B1> 
      <C1> 
       <xsl:value-of select="$Resp/Response/RespRec/Data/C1" /> 
      </C1> 
      <D1> 
       <xsl:value-of select="$Resp/Response/RespRec/Data/D1" /> 
      </D1> 
     </ABCD> 
    </xsl:for-each> 

</xsl:element> 
</xsl:template> 

期望出認沽:

<Response> 
    <ABCD> 
    <A1>gmailcom</A1> 
         <B1>YES</B1> 
         <C1>PRIVACY</C1> 
         <D1>00</D1> 
</ABCD> 
<ABCD> 
<A1>Ymailcom</A1> 
         <B1>DES</B1> 
         <C1>TYPE</C1> 
         <D1>01</D1> 
    </ABCD> 
    </Response> 

但上面的代碼不會放棄希望的result.Please幫助。 但上面的代碼沒有給出想要的結果。請幫助。但上面的代碼沒有給出預期的結果。請幫助。

回答

0

在XSLT 1.0中,您輸出的XML就是所謂的結果樹片段。它不是一個節點集,所以你不能在XPath選擇中使用它。基本上你可以用它做的唯一事情就是將它複製到結果文檔中。 (XSLT 2.0修復了這種愚蠢,謝天謝地。)

但是,如果您的XSLT處理器支持EXSLT擴展,則可以使用exsl:node-set將結果樹片段轉換爲節點集。 http://exslt.org/exsl/functions/node-set/index.html

<xsl:for-each select="exsl:node-set($Resp)/Response/RespRec/Data"> 

確保在某處聲明exsl命名空間前綴,最好是在xsl上:stylesheet元素。

xmlns:exsl="http://exslt.org/common" 

此外,您的xsl:value-of語句不會執行您希望它們執行的操作。當你在xsl:for-each循環中時,上下文節點是一個Data節點。然後,您嘗試從頂部再次選擇,而不是僅選擇子元素。更改他們只是看起來像這樣:

<A1> 
    <xsl:value-of select="A1" /> 
</A1> 
+0

謝謝Shaun.It確實有效。 – sasPrasH

+0

如何選擇具有相同名稱的子元素。例如:。而這個節點集也存儲在一個變量中。 – sasPrasH

1

假設你使用XSLT 2.0處理器,您可以訪問使用XPath變量的內容,但您需要使用您的for-each例如內相對錶達

<xsl:for-each select="$Resp/Response/RespRec/Data"> 
     <ABCD> <!-- It can repeat as many as Data element is there --> 
      <A1> 
       <xsl:value-of select="A1" /> 
      </A1> 

我不過建議編寫模板推節點模板與apply-templates