用XSLT替换String

时间:2012-02-16 08:08:12

标签: xslt wsdl

我有一个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

2 个答案:

答案 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)。