2013-10-28 132 views
0

我有下面的輸入XML。填充多個節點集

<Body> 
<AddressInfo> 
<Address> 
<PIN>123</PIN> 
<Street>CAN</Street> 
</Address> 
<Address> 
<PIN>456</PIN> 
<Street>MAN</Street> 
</Address> 
</AddressInfo> 
</Body> 

我的預期輸出是

<SOAPENV> 
<Header/> 
<ResponseBody> 
<AddressDetails> 
<UserPIN>123</UserPIN> 
<UserStreet>CAN</UserStreet> 
</AddressDetails> 
<AddressDetails> 
<UserPIN>456</UserPIN> 
<UserStreet>MAN</UserStreet> 
</AddressDetails> 
</ResponseBody> 
</SOAPENV> 

我的問題是,當我給XPath和提取的值從XML,並試圖填充輸出。我總是隻獲得第一個節點集。其他節點集被忽略。如何在我的輸出soap信封中填充多個節點集。

回答

0

您可以使用下面的樣式表:

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/> 

    <xsl:template match="@*|node()"> 
     <xsl:apply-templates select="@*|node()" /> 
    </xsl:template> 

    <xsl:template match="Body"> 
     <SOAPENV> 
      <Header/> 
      <ResponseBody> 
       <xsl:apply-templates select="@*|node()" /> 
      </ResponseBody> 
     </SOAPENV> 
    </xsl:template> 

    <xsl:template match="Address"> 
     <AddressDetails> 
      <UserPIN><xsl:value-of select="PIN" /></UserPIN> 
      <UserStreet><xsl:value-of select="Street" /></UserStreet> 
     </AddressDetails> 
    </xsl:template> 
</xsl:stylesheet> 

如果你不想寫下下面AddressDetails所有元素,所有這些元素都需要文本User在它的面前,你可以使用一個xsl:for-each圈狀這個:

<xsl:template match="Address"> 
    <AddressDetails> 
     <xsl:for-each select="*"> 
      <xsl:element name="User{name()}"> 
       <xsl:value-of select="." /> 
      </xsl:element> 
     </xsl:for-each> 
    </AddressDetails> 
</xsl:template> 

只需用這個替換另一個模板。

+0

HI論壇,第一個案件爲我工作,我同意,因爲它給了我即時解決方案。現在,我想知道它是如何工作的。任何人都可以通過在@ * Node中使用apply模板來解釋我們在這裏所做的。我可以看到,當我改變字段時結果不一樣。任何一個人都可以自由告訴我。 TIA。 – Mano