我有一个wsdl(我从Web服务获得),我必须将当前地址字符串替换为其他内容,而Idea则使用XSLT来实现。只有一个问题,我从未对XSLT做过任何事情,所以我不知道该怎么做。我找到了一个如何做到这一点的简单示例,但我得到了如何从wsdl中获取旧字符串,以便我可以替换它。
这是示例
<?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>
更新:
这就是我现在所拥有的:
<soap:address location="http://localhost:4434/miniwebservice"/>
这就是我想要的:
<soap:address location="http://localhost:4433/miniwebservice"/>
我刚刚将端口号从4434替换为4433
答案 0 :(得分: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/)。
答案 1 :(得分: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更改为soap命名空间uri(我不确定)并使用XSLT 2.0处理器(例如:saxon)。