2012-02-16 210 views
0

我有一個wsdl(我從Web服務獲得),我必須將當前地址字符串替換爲其他字符,這個想法是使用XSLT來完成的。只有一個問題,我從來沒有用XSLT做過任何事情,所以我不知道該怎麼做。我已經找到了一個簡單的例子,如何做到這一點,但我得到如何獲得舊的字符串出wsdl,所以我可以取代它。用XSLT替換字符串

這裏是舉例

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:inm="http://www.inmagic.com/webpublisher/query" version='1.0'> 
    <xsl:output method="text" encoding="UTF-8"/> 

    <xsl:preserve-space elements="*"/> 
    <xsl:template match="text()"></xsl:template> 

    <xsl:template match="test"> 
    <xsl:apply-templates/> 

    <xsl:for-each select="testObj"> 
     'Notes or subject' <xsl:call-template name="rem-html"><xsl:with-param name="text" select="SBS_ABSTRACT"/></xsl:call-template> 
    </xsl:for-each> 
    </xsl:template> 

    <xsl:template name="rem-html"> 
    <xsl:param name="text"/> 
<xsl:variable name="newtext" select="translate($text,'a','b')"/> 
    </xsl:template> 
</xsl:stylesheet> 

UPDATE:

這是我現在有:

<soap:address location="http://localhost:4434/miniwebservice"/> 

這就是我想:

<soap:address location="http://localhost:4433/miniwebservice"/> 

我剛取代了這個號碼港從4434到4433

+0

向我們發送您希望獲得的輸入XML文檔和輸出的示例。 – penartur 2012-02-16 08:10:33

+0

@penartur完成,更新了問題 – Kiesa 2012-02-16 08:15:47

回答

1
<xsl:template match="soap:address/@location"> 
    <xsl:attribute name="location"> 
     <xsl:call-template name="string-replace"> 
      <xsl:with-param name="haystack" select="current()"/> 
      <xsl:with-param name="search">:4434/</xsl:with-param> 
      <xsl:with-param name="replace">:4433/</xsl:with-param> 
     </xsl:call-template> 
    </xsl:attribute> 
</xsl:template> 

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

注意,有在XSLT沒有內置的字符串替換功能,你需要把它在其他地方(例如,編寫此樣式表時使用了http://symphony-cms.com/download/xslt-utilities/view/26418/)。

+0

我剛剛試過id,用你的建議替換了「Example」註釋,但如果我嘗試運行它,我得到一個異常:無法編譯樣式表。檢測到1個錯誤。 – Kiesa 2012-02-16 08:43:12

+0

我用一些隨機文本替換了match =「soap:address/@ location」並編譯了它,並沒有替換文本,但至少編譯了 – Kiesa 2012-02-16 08:53:41

+0

你應該在'''中聲明'soap'命名空間'報頭;否則,你將無法引用'soap'命名空間中的節點/屬性。只需將'xmlns:soap'屬性的值從源文件根節點複製到''。 – penartur 2012-02-16 09:08:43

0

注意與XSLT 2.0你有一個更簡單的方法使用正則表達式來進行:

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:soap="..." 
    version="2.0"> 
    <xsl:param name="newPort">4433</xsl:param> 
    <xsl:template match="@*|node()"> 
     <xsl:copy> 
      <xsl:apply-templates select="@*|node()"/> 
     </xsl:copy> 
    </xsl:template> 
    <xsl:template match="soap:address/@location"> 
     <xsl:attribute name="location"> 
      <xsl:value-of select="replace(., 
       '^(http://[^/]*:)[0-9]{4}/', 
       concat('$1',$newPort,'/'))"/> 
     </xsl:attribute> 
    </xsl:template> 
</xsl:stylesheet> 

要使其工作,你就必須在xmlns:soap="..."更改命名空間URI的肥皂命名空間URI(I」 m不確定)並使用XSLT 2.0處理器(例如:saxon)。