Если у вас есть 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)
....
Ну, в 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;
}
}
Одним из возможных решений является использование функции normalize-space()
(работает даже в XSLT 1.0 ).
Он делает еще больше, то есть заменяет несколько белых символов внутри на одиночное пространство.
Чтобы применить его ко всем текстовым узлам, добавьте такой шаблон:
<xsl:template match="text)">
<xsl:value-of select="normalize-space()"/>
</xsl:template>
Но если у вас есть также шаблон идентификации , вышеуказанный шаблон должен быть в вашем сценарии ] после шаблон идентичности .