XSLT 1.0 для удаления начальных и конечных пробелов

Если у вас есть std::vector<int> или std::vector<double>, то лучше использовать auto (со значением copy) вместо const auto&, так как копирование int или double дешево:

for (auto x : vec)
    ....

Но если у вас есть std::vector<MyClass>, где MyClass имеет некоторую нетривиальную семантику копирования (например, std::string, некоторый сложный пользовательский класс и т. д.), то я бы предложил использовать const auto&, чтобы избежать глубоких копий:

for (const auto & x : vec)
    ....
0
задан Dev 21 February 2019 в 03:23
поделиться

2 ответа

Ну, в XSLT 1.0 вы можете использовать метод рекурсивного шаблона (НЕ предпочтительно) для удаления начальных и конечных пробелов (на случай, если вы не хотите использовать normalize-space())

Давайте предположим, что ваш ввод выглядит следующим образом:

<?xml version="1.0" encoding="UTF-8"?>
<body>
    <h1>                A text having so many leading and trailing spaces!           </h1>
</body>

Примечание: В приведенном ниже решении используется xmlns:str="xalan://org.apache.commons.lang.StringUtils" для использования его двух функций [ 116] и substringBeforeLast

Решение XSLT 1.0 для решения задачи:

<?xml version="1.0" encoding="UTF-8" ?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:str="xalan://org.apache.commons.lang.StringUtils" 
exclude-result-prefixes="str">
<xsl:output method="xml" indent="yes" />

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

<xsl:template match="h1">
    <h1>
        <xsl:variable name="leadingSpaceRemoved">
            <xsl:call-template name="removeLeadingSpace">
                <xsl:with-param name="text" select="." />
            </xsl:call-template>
        </xsl:variable>
        <xsl:variable name="trailingSpaceRemoved">
            <xsl:call-template name="removeTrailingSpace">
                <xsl:with-param name="text" select="$leadingSpaceRemoved" />
            </xsl:call-template>
        </xsl:variable>

        <xsl:value-of select="$trailingSpaceRemoved" />
    </h1>
</xsl:template>

<xsl:template name="removeLeadingSpace">
    <xsl:param name="text" />

    <xsl:variable name="h1" select="$text" />
    <xsl:choose>
        <xsl:when test="starts-with($h1,' ')">
            <xsl:call-template name="removeLeadingSpace">
                <xsl:with-param name="text" select="substring-after($h1,' ')" />
            </xsl:call-template>
        </xsl:when>
        <xsl:otherwise>
            <xsl:value-of select="$h1" />
        </xsl:otherwise>
    </xsl:choose>
</xsl:template>

<xsl:template name="removeTrailingSpace">
    <xsl:param name="text" />

    <xsl:variable name="h1" select="$text" />
    <xsl:choose>
        <xsl:when test="str:ends-with($h1,' ')">
            <xsl:call-template name="removeTrailingSpace">
                <xsl:with-param name="text" select="str:substringBeforeLast($h1,' ')" />
            </xsl:call-template>
        </xsl:when>
        <xsl:otherwise>
            <xsl:value-of select="$h1" />
        </xsl:otherwise>
    </xsl:choose>
</xsl:template>
</xsl:stylesheet>

Кроме того, если вы можете вызвать библиотеку / класс Java в своей среде, оно будет будет проще добиться того же, что и ниже:

Ваш XSLT будет:

<?xml version="1.0" encoding="UTF-8" ?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:stringparser="xalan://com.example.commons.xsl.StringUtil"
exclude-result-prefixes="stringparser">

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

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

<xsl:template match="h1">
    <h1>
        <xsl:value-of select="stringparser:trim(.)" />
    </h1>
</xsl:template>
</xsl:stylesheet>

И StringUtil.java будет:

import org.apache.commons.lang.StringUtils;
public class StringUtil {
/**
 * 
 * @param input
 * @return remove leading and trailing spaces.
 */
public static String trim(final String input) {
    if (StringUtils.isNotBlank(input)) {
        return input.trim();
    }
    return input;
}
}
0
ответ дан Vebbie 21 February 2019 в 03:23
поделиться

Одним из возможных решений является использование функции normalize-space() (работает даже в XSLT 1.0 ).

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

Чтобы применить его ко всем текстовым узлам, добавьте такой шаблон:

<xsl:template match="text)">
    <xsl:value-of select="normalize-space()"/>
</xsl:template>

Но если у вас есть также шаблон идентификации , вышеуказанный шаблон должен быть в вашем сценарии ] после шаблон идентичности .

0
ответ дан Valdi_Bo 21 February 2019 в 03:23
поделиться
Другие вопросы по тегам:

Похожие вопросы: