заменить строку на XSLT - PullRequest
       7

заменить строку на XSLT

0 голосов
/ 16 февраля 2012

У меня есть wsdl (который я получаю из веб-службы), где я должен заменить текущий адрес String на что-то другое. Идея заключалась в том, чтобы использовать 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 ]

1 голос
/ 16 февраля 2012
<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 / * При написании этой таблицы стилей было использовано 1004 *.

0 голосов
/ 16 февраля 2012

Обратите внимание, что с 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>

Чтобы это работало, вам просто нужно изменить URI пространства имен в xmlns:soap="..." на пространство имен мыла(я не уверен в этом) и использую процессор XSLT 2.0 (например, saxon).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...