Xslt преобразует, изменяя только часть текста строки подключения - PullRequest
0 голосов
/ 10 февраля 2012

Я какое-то время обменивал строки подключения оптом с xlst, поэтому

<xsl:template match="/configuration/connectionStrings/add[@name='SybaseDB']/@connectionString" >
   <xsl:attribute name="connectionString">
      <xsl:text>host='LeroyJenkins.org';Pooling=true;Port='5100';UID='LeroyJenkins';Password='12345';Database='LeroyJenkins';Min Pool Size=5;Load Balance Timeout=30;Max Pool Size=50;Connection Timeout=60000;Workstation ID='LeroyJenkins';Fetch Buffer Size=4096;Clone Connection If Needed=True</xsl:text>
   </xsl:attribute>
</xsl:template>

Но что, если я хочу изменить только элемент

;Password='12345'

, чтобы заменить 12345с другим значением?Скажите "LeroyJenkins" ...

Как я могу это сделать?

Я нашел много сообщений о манипулировании подстрокой в ​​xslt ... но я боюсь, что не смог понятькак применить это к моей ситуации.

Я использую этот инструмент: TransformXml.exe из этой статьи. http://www.codeproject.com/Articles/16549/TransformXML-a-command-line-utility-to-apply-XSL-t

Если кто-то может объяснить, что происходит, я могу усвоитьи применить его, я был бы очень признателен.

Спасибо,

Cal-

1 Ответ

2 голосов
/ 12 февраля 2012

Несколько сложнее, чем просто манипуляции со строками. Он преобразует строку подключения в структуру XML, заменяет пароль и собирает его обратно. Вы сможете заменить другие элементы, кроме пароля, изменив шаблон change-password внизу.

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    xmlns:exsl="http://exslt.org/common"
    exclude-result-prefixes="xs exsl"
    version="1.0">

    <xsl:output method="xml" indent="yes"/>

    <xsl:variable name="target-name">SybaseDB</xsl:variable>
    <xsl:variable name="new-password">NEWPASSWORD</xsl:variable>

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

    <xsl:template match="/configuration/connectionStrings/add">
        <xsl:choose>
            <xsl:when test="@name=$target-name">
                <xsl:variable name="items">
                    <xsl:call-template name="parse-connetion-string">
                        <xsl:with-param name="text" select="@connectionString"/>
                    </xsl:call-template>
                </xsl:variable>

                <xsl:variable name="items-new-password">
                    <xsl:apply-templates mode="change-password" select="exsl:node-set($items)"/>
                </xsl:variable>

                <xsl:copy>
                    <xsl:copy-of select="@*"/>
                    <xsl:attribute name="connectionString">
                        <xsl:apply-templates mode="generate-connection-string" select="exsl:node-set($items-new-password)"/>
                    </xsl:attribute>
                </xsl:copy>
            </xsl:when>
            <xsl:otherwise>
                <xsl:copy-of select="."/>
            </xsl:otherwise>
        </xsl:choose>
    </xsl:template>

    <xsl:template name="parse-connetion-string">
        <xsl:param name="text"/>

        <xsl:variable name="itemString">
            <xsl:choose>
                <xsl:when test="contains($text,';')">
                    <xsl:value-of select="substring-before($text,';')"/>
                </xsl:when>
                <xsl:otherwise>
                    <xsl:value-of select="$text"/>
                </xsl:otherwise>
            </xsl:choose>
        </xsl:variable>
        <xsl:variable name="itemName" select="substring-before($itemString,'=')"/>
        <xsl:variable name="itemValue" select="substring-after($itemString,'=')"/>
        <xsl:variable name="rest" select="substring-after($text,';')"/>

        <item name="{$itemName}" value="{$itemValue}"/>

        <xsl:if test="string-length($rest)!=0">
            <xsl:call-template name="parse-connetion-string">
                <xsl:with-param name="text" select="$rest"/>
            </xsl:call-template>
        </xsl:if>
    </xsl:template>

    <xsl:template match="item" mode="generate-connection-string">
        <xsl:if test="position() != 1">;</xsl:if>
        <xsl:value-of select="@name"/>
        <xsl:text>=</xsl:text>
        <xsl:value-of select="@value"/>
    </xsl:template>

    <xsl:template match="item" mode="change-password">
        <xsl:choose>
            <xsl:when test="@name='Password'">
                <item name="{@name}" value="'{$new-password}'"/>
            </xsl:when>
            <xsl:otherwise>
                <xsl:copy-of select="."/>
            </xsl:otherwise>
        </xsl:choose>
    </xsl:template>
</xsl:stylesheet>
...