2013-10-28 83 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