2012-08-07 121 views
0

我想申請XSL(使用申請模板)的XML,XML命名空間無法應用XSL

這裏是XML,

<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
    <soap:Body> 
     <SearchResponse xmlns="http://xyz/abcApi"> 
      <SearchResult> 
       <Status> 
        <StatusCode>01</StatusCode> 
        <Description>Successful</Description> 
        <Category>SR</Category> 
       </Status> 
       <Result> 
        <WSResult> 
         <Index>1</Index> 
         <CityId>111</CityId> 
        </WSResult> 
        <WSResult> 
         <Index>2</Index> 
         <CityId>111</CityId> 
        </WSResult> 
       </Result> 
       <SessionId>1fc15f22-a670-4f33-b050-c93fa3184cb1</SessionId> 
       <IsDomestic>true</IsDomestic> 
      </SearchResult> 
     </SearchResponse> 
    </soap:Body> 
</soap:Envelope> 

和XSL是,

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:template match="/"> 
     <Response> 
      <Param> 
       <Ref> 
        <Results> 
         <xsl:apply-templates select="//SearchResponse/SearchResult/Result/WSResult"/> 
        </Results> 
       </Ref> 
      </Param> 
     </Response> 
    </xsl:template> 
    <xsl:template match="WSResult"> 
     <Result> 
      <Property> 
       <xsl:attribute name="Id"><xsl:value-of select="position()"/></xsl:attribute> 
       <xsl:attribute name="CityCode"><xsl:value-of select="CityId"/></xsl:attribute> 
      </Property> 
     </Result> 
    </xsl:template> 
</xsl:stylesheet> 

此xml無法應用指定上面的xsl。請提出解決方案。

回答

1

這是因爲您應該在XPath表達式中指定名稱空間。 首先,您在標題中添加一個名稱空間(我選擇「搜索」作爲前綴,但您可以更改它)。然後,將此前綴添加到所有元素名稱中:

<?xml version="1.0" encoding="UTF-8"?> 
    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
      xmlns:search="http://xyz/abcApi"> 
     <xsl:template match="/"> 
      <Response> 
       <Param> 
        <Ref> 
         <Results> 
          <xsl:apply-templates select="//search:SearchResponse/search:SearchResult/search:Result/search:WSResult"/> 
         </Results> 
        </Ref> 
       </Param> 
      </Response> 
     </xsl:template> 
     <xsl:template match="search:WSResult"> 
      <Result> 
       <Property> 
        <xsl:attribute name="Id"><xsl:value-of select="position()"/></xsl:attribute> 
        <xsl:attribute name="CityCode"><xsl:value-of select="search:CityId"/></xsl:attribute> 
       </Property> 
      </Result> 
     </xsl:template> 
    </xsl:stylesheet>