В xslt 1.0, как мне использовать альтернативу для функции replace () - PullRequest
0 голосов
/ 04 ноября 2018

Введите код xml:

<Job>
<Telephone> 123/ 345-566 | 456-394-798 | (234)-453-245 </Telephone>
</Job>

Выходной код xml:

<Job>
<PhoneAreaCode> 123|456|234 </PhoneAreaCode>
</Job>

Я написал файл xslt 2.0, используя функцию replace () с regex для получения выходного xml. Но мой VisualStudio поддерживает только xslt 1.0.

Не могли бы вы помочь мне в написании xslt-кода для выходного xml-кода.

Примечание : мне нужно сохранить 123 | 456 | 234 в глобальной переменной, чтобы я мог использовать ее в различных случаях в моем выходном XML-файле.

Спасибо !, Заранее.

1 Ответ

0 голосов
/ 04 ноября 2018

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

Глядя на приведенный вами пример, мне кажется, что настоящая проблема здесь не в том, как replace(), а в том, как tokenize().

Рассмотрим следующую таблицу стилей:

XSLT 1.0

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:strip-space elements="*"/>

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

<xsl:template match="Telephone">
    <PhoneAreaCode>
        <xsl:call-template name="tokenize-and-extract">
            <xsl:with-param name="text" select="."/>
        </xsl:call-template>
    </PhoneAreaCode>
</xsl:template>

<xsl:template name="tokenize-and-extract">
    <xsl:param name="text"/>
    <xsl:param name="delimiter" select="'|'"/>
        <xsl:variable name="token" select="substring-before(concat($text, $delimiter), $delimiter)" />
        <xsl:if test="$token">
            <xsl:value-of select="substring(translate($token, ' /()-', ''), 1, 3)"/>
        </xsl:if>
        <xsl:if test="contains($text, $delimiter)">
            <!-- recursive call -->
            <xsl:text>|</xsl:text>
            <xsl:call-template name="tokenize-and-extract">
                <xsl:with-param name="text" select="substring-after($text, $delimiter)"/>
            </xsl:call-template>
        </xsl:if>
</xsl:template>

</xsl:stylesheet>

Применительно к вашему примеру входного XML, результат будет:

<Job>
  <PhoneAreaCode>123|456|234</PhoneAreaCode>
</Job>
...