2013-05-01 24 views
0

我想知道我們如何將前綴類型[xsi:type「...」]添加到每個重複的父節點並選擇它的所有子節點。 xml是soap封裝的,輸出是對信封的標題和正文的修改。 樣品輸入XML是:如何將前綴類型添加到重複父節點中,並使用XSLT爲每個元素選擇所有元素?

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" 
xmlns:ns="http://Example1.com" 
xmlns:ns1="http://Sample1.com"> 

<soapenv:Header> 
    <ns:SessionHeader> 
     <ns:Auth>a1b2c4d5</ns:Auth> 
    </ns:SessionHeader> 
</soapenv:Header> 
<soapenv:Body> 
    <ns:Create> 
     <!--Zero or more repetitions:--> 
     <ns:BankAccount> 
      <ns1:AccountNumber>1111</ns1:AccountNumber> 
      <ns1:BillingState>Texas</ns1:BillingState> 
      <ns1:Name>John</ns1:Name> 
      <ns1:Phone>+1 111</ns1:Phone> 
      <ns1:Site>Chicago</ns1:Site> 
      <ns1:Website>www.site1.com</ns1:Website> 
      . 
      . 
     </ns:BankAccount> 
     <ns:BankAccount> 
      <ns1:AccountNumber>222</ns1:AccountNumber> 
      <ns1:BillingState>Hawai</ns1:BillingState> 
      <ns1:Name>Bob</ns1:Name> 
      <ns1:Phone>+2 222</ns1:Phone> 
      <ns1:Site>Canada</ns1:Site> 
      <ns1:Website>www.site2.com</ns1:Website> 
      . 
      . 
     </ns:BankAccount> 
     . 
     . 
     . 
    </ns:Create> 
</soapenv:Body> 
</soapenv:Envelope> 

對於給定的輸入XML中的所需的輸出XML是

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" 
xmlns:ns="http://Example1.com" 
xmlns:ns1="http://Sample1.com" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 

    <soapenv:Header> 
     <ns:SessionHeader> 
      <ns:Auth>a1b2c4d5</ns:Auth> 
     </ns:SessionHeader> 
    </soapenv:Header> 
    <soapenv:Body> 
     <ns:Create> 
      <ns:BankAccount xsi:type="Account" xmlns="http://Example1.com" > 
      <ns1:AccountNumber>1111</ns1:AccountNumber> 
      <ns1:BillingState>Texas</ns1:BillingState> 
      <ns1:Name>John</ns1:Name> 
      <ns1:Phone>+1 111</ns1:Phone> 
      <ns1:Site>Chicago</ns1:Site> 
      <ns1:Website>www.site1.com</ns1:Website> 
       . 
       . 
      </ns:BankAccount> 

      <ns:BankAccount xsi:type="Account" xmlns="http://Example1.com" > 
      <ns1:AccountNumber>222</ns1:AccountNumber> 
      <ns1:BillingState>Hawai</ns1:BillingState> 
      <ns1:Name>Bob</ns1:Name> 
      <ns1:Phone>+2 222</ns1:Phone> 
      <ns1:Site>Canada</ns1:Site> 
      <ns1:Website>www.site2.com</ns1:Website> 
       . 
       . 
      </ns:BankAccount> 

      . 
      . 
      . 

     </ns:Create> 
    </soapenv:Body> 
</soapenv:Envelope> 

我與下面提到XSL嘗試,但它不產生所需要的結果。

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

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

    <xsl:template match="/"> 
     <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" 
     xmlns:ns="http://Example1.com" 
     xmlns:ns1="http://Sample1.com" 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
     <soapenv:Header> 
      <ns:SessionHeader> 
       <ns:Auth> 
        <xsl:value-of select="//ns:Auth"/> 
       </ns:Auth> 
      </ns:SessionHeader> 
     </soapenv:Header> 
     <soapenv:Body> 
      <ns:Create> 
       <ns:BankAccount xsi:type="Account" xmlns="http://Example1.com"> 
        <xsl:apply-template select="node()"/> 
       </ns:BankAccount> 
      </ns:Create> 
     </soapenv:Body> 
    </soapenv:Envelope> 
</xsl:template> 

</xsl:stylesheet> 

我不知道我在哪裏出錯。 我是否需要首先獲取其前綴添加元素的所有父級「BankAccount」節點,然後再生成肥皂信封? 請指導我。

回答

0

如果你只是想添加xsi:type="Account"到每個ns:BankAccount元素,使用identity transformation有專門的模板ns:BankAccount那份同時增加該屬性的內容:

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

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

    <xsl:template match="ns:BankAccount"> 
     <xsl:copy> 
      <xsl:attribute name="xsi:type">Account</xsl:attribute> 
      <xsl:apply-templates select="@* | node()"/> 
     </xsl:copy> 
    </xsl:template> 

</xsl:stylesheet> 
+0

感謝您的答覆和建議。我已經試過這個,但我得到的答案是這樣的:'這不是事物我期待...我需要這樣的'' – CatchLight 2013-05-02 12:19:53

相關問題