2013-11-05 61 views
1

我有一個xml,我希望得到預期的格式,如下所示。我正在嘗試使用應用模板概念。但一些如何,我無法看到預期的結果。問題,同時應用適用模板

<?xml version="1.0" encoding="UTF-8"?> 
<SOAP:ENV> 
    <SOAP:HEADER/> 
    <SOAP:BODY> 
     <OutputResponse> 
      <RespStructure ID="1"> 
       <RespStatus>Success</RespStatus> 
       <RespMessage> 
        <Country>Australia</Country> 
        <Capital>Canberra</Capital> 
       </RespMessage> 
       <RespMessage> 
        <Country>England</Country> 
        <Capital>London</Capital> 
       </RespMessage> 
       <RespMessage> 
        <Country>China</Country> 
        <Capital>Beijing</Capital> 
       </RespMessage> 
      </RespStructure> 
     </OutputResponse> 
    </SOAP:BODY> 
</SOAP:ENV> 

現在在此消息中,我將RespMessage和RespStatus都作爲RespStructure的一部分。但Respstatus是RespMessage是多值節點集(Country,Capital)的單個節點集。當我使用應用模板時,只有第一個RespMessage被選中(第二個重複沒有出現),或者Respstatus沒有給出它的值。我試圖得到低於輸出。

<?xml version="1.0" encoding="UTF-8"?> 
<SOAP:ENV> 
    <SOAP:HEADER/> 
    <SOAP:BODY> 
     <OutputResponse> 
      <RespStructure ID="1"> 
       <TransactionStatus>Success</TransactionStatus> 
       <ListOfCountries> 
        <SelectedCountry>Australia</SelectedCountry> 
        <FIrstSelectedCapital>Canberra</FIrstSelectedCapital> 
       </ListOfCountries> 
       <ListOfCountries> 
        <SelectedCountry>England</SelectedCountry> 
        <FIrstSelectedCapital>London</FIrstSelectedCapital> 
       </ListOfCountries> 
       <ListOfCountries> 
        <SelectedCountry>China</SelectedCountry> 
        <FIrstSelectedCapital>Beijing</FIrstSelectedCapital> 
       </ListOfCountries> 
      </RespStructure> 
     </OutputResponse> 
    </SOAP:BODY> 
</SOAP:ENV> 

我改變域的所有的名字,但我應該得到所有的多個節點,沒有任何遺漏。

我用下面的代碼片段從論壇,但我沒有申請。我如何使用下面的代碼片段來填充RespStatus。當我給了不同的模板,兩個都沒有被調用,只有一個被打印。我試圖將應用模板更改爲更具體的節點集。

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

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

<xsl:template match="RespMessage"> 
    <ListOfCountries> 
     <SelectedCountry><xsl:value-of select="Country" /></SelectedCountry> 
     <FIrstSelectedCapital><xsl:value-of select="Capital" /></FIrstSelectedCapital> 
    </ListOfCountries> 
</xsl:template> 

感謝您的回覆。對任何拼寫錯誤抱歉。

+0

嗨論壇,是我的問題制定難以理解。 – Mano

回答

2

看看你的XSL代碼片段,它應該匹配並轉換所有RespMessage元素,除非還有其他影響事物的XSLT的其他部分。

一個問題你確實有,這可能是你剛纔怎麼editted你的問題,是你原來的XML使用命名空間前綴「SOAP」,但還沒有宣佈參加這個前綴的命名空間。我希望第一行是這樣的

<SOAP:ENV xmlns:SOAP="http://schemas.xmlsoap.org/soap/envelope/"> 

沒有這個,你將無法將它應用於你的XSLT。

命名空間的使用也意味着第二個模板,匹配身體,不會匹配任何

<xsl:template match="Body"> 

(實際上,因爲它是區分大小寫它不會匹配任何東西,在原XML是SOAP:BODY

查看XSLT的其餘部分,如果您希望在不更改的情況下跨現有元素進行復制,則應該使用標識模板。在你的XSLT的第一個模板應該是這樣的

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

有了這個地方,你需要的是增加一個模板進行匹配,並變換RespStatus

<xsl:template match="RespStatus"> 
    <xsl:element name="TransactionStatus"> 
     <xsl:value-of select="." /> 
    </xsl:element> 
</xsl:template> 

試試這個XSLT

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:SOAP="http://schemas.xmlsoap.org/soap/envelope/"> 
<xsl:output omit-xml-declaration="yes" indent="yes" /> 

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

<xsl:template match="RespStatus"> 
    <xsl:element name="TransactionStatus"> 
     <xsl:value-of select="." /> 
    </xsl:element> 
</xsl:template> 

<xsl:template match="RespMessage"> 
    <xsl:element name="ListOfCountries"> 
     <SelectedCountry><xsl:value-of select="Country" /></SelectedCountry> 
     <FIrstSelectedCapital><xsl:value-of select="Capital" /></FIrstSelectedCapital> 
    </xsl:element> 
</xsl:template> 
</xsl:stylesheet> 
+0

謝謝蒂姆。通過保持RespStatus的狀態,我嘗試了XSLT,儘管元素名稱「TransactionStatus」出現,但元素值填充爲null。 – Mano

+0

我對XSLT做了小小的調整,儘管它實際上並沒有什麼差別。試試在http:// www。xmlplayground.com/V4WRuM#sthash.jYHwbfYZ.dpuf –

+0

你好Tim,我爲那個特定的Status元素應用了XPATH,因爲它不像其他元素那樣重複使用(在第二個模板下面),你的回覆很有用。感謝您的時間和幫助。 – Mano