HTML-форматирование частичного содержимого в узле XML - PullRequest
0 голосов
/ 27 августа 2010

У меня есть документ XML, в котором есть узел XML с именем «Description»

Узел Description содержит текст типа «Это длинное описание».

Когда загружается файл XMLотображается в браузере, мне нужно только слово «длинный», чтобы быть курсивом.Я понимаю, что мог бы использовать XSLT для стилизации всего узла Description, но как использовать CSS-стилизацию только для небольшой части содержимого узла?

Ответы [ 2 ]

2 голосов
/ 28 августа 2010

Эта таблица стилей XSLT 1.0:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:template match="node()|@*">
        <xsl:copy>
            <xsl:apply-templates select="node()|@*"/>
        </xsl:copy>
    </xsl:template>
    <xsl:template match="text()[ancestor::Description]" name="replace">
        <xsl:param name="pString" select="."/>
        <xsl:choose>
            <xsl:when test="contains($pString,' long ')">
                <xsl:value-of select="substring-before($pString,' long ')"/>
                <i> long </i>
                <xsl:call-template name="replace">
                    <xsl:with-param name="pString" 
                    select="substring-after($pString,' long ')"/>
                </xsl:call-template>
            </xsl:when>
            <xsl:otherwise>
                <xsl:value-of select="$pString"/>
            </xsl:otherwise>
        </xsl:choose>
    </xsl:template>
</xsl:stylesheet>

С этим входом:

<Description>This is a long description</Description>

Выход:

<Description>This is a<i> long </i>description</Description>

И эта таблица стилей XSLT 2.0:

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:template match="node()|@*">
        <xsl:copy>
            <xsl:apply-templates select="node()|@*"/>
        </xsl:copy>
    </xsl:template>
    <xsl:template match="text()[ancestor::Description]">
        <xsl:analyze-string select="." regex="([\p{{P}}\p{{Z}}])long([\p{{P}}\p{{Z}}])">
            <xsl:matching-substring>
                <xsl:value-of select="regex-group(1)"/>
                <i>long</i>
                <xsl:value-of select="regex-group(2)"/>
            </xsl:matching-substring>
            <xsl:non-matching-substring>
                <xsl:value-of select="."/>
            </xsl:non-matching-substring>
        </xsl:analyze-string>
    </xsl:template>
</xsl:stylesheet>

Вывод:

<Description>This is a <i>long</i> description</Description>
1 голос
/ 27 августа 2010

Ты не. Как сказано в спецификации CSS3,

Селекторы определяют следующую функцию:

выражение ∗ элемент → логическое значение

Т.е., нет концепции выбора чего-либо, кроме элемента.

Если «long» должен быть выделен курсивом, его нужно будет поместить в отдельный встроенный элемент. <em>, вероятно, будет подходящим выбором.

Вы можете сделать это на стороне сервера перед отправкой документа в браузер, или вы можете использовать JavaScript и, возможно, что-нибудь простое, например, регулярное выражение, чтобы сделать это на стороне клиента.

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