обработка строк с помощью xsl: apply-templates - PullRequest
0 голосов
/ 13 апреля 2011

У меня есть xml, который выглядит следующим образом:

<Parent> Running text with marked up entities like 
  <Child>Entity1</Child> 
 and, text in the middle too, and
  <Child> Entity2 </Child>
</Parent>

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

Теперь, когда я фиксирую содержимое родительского тега в переменной, чтобы выполнить некоторую обработку строк в XSL, я теряю основную структуру xml и не могу применить шаблон выделения к дочерним элементам.

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

Есть идеи?

Ответы [ 2 ]

0 голосов
/ 13 апреля 2011

Вы не показали ни одного кода, из-за чего довольно сложно сказать, что вы сделали неправильно, но распространенная ошибка, объясняющая описанные симптомы, - написать

<xsl:variable name="x">
  <xsl:value-of select="some/node/path"/>
</xsl:variable>

когда вы должны были написать

<xsl:variable name="x" select="some/node/path"/>

Пожалуйста, в будущем не сообщайте нам, что ваш код не работает, не показывая нам ваш код.

0 голосов
/ 13 апреля 2011

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

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:preserve-space elements="*"/>
    <xsl:template match="Parent">
        <div>
            <xsl:apply-templates mode="preserve"/>
        </div>
    </xsl:template>
    <xsl:template match="text()" mode="preserve" name="split">
        <xsl:param name="pString" select="."/>
        <xsl:choose>
            <xsl:when test="contains($pString,'&#xA;')">
                <xsl:value-of select="substring-before($pString,'&#xA;')"/>
                <br/>
                <xsl:call-template name="split">
                    <xsl:with-param name="pString"
                     select="substring-after($pString,'&#xA;')"/>
                </xsl:call-template>
            </xsl:when>
            <xsl:otherwise>
                <xsl:value-of select="$pString"/>
            </xsl:otherwise>
        </xsl:choose>
    </xsl:template>
    <xsl:template match="Child" mode="preserve">
        <b>
            <xsl:apply-templates mode="preserve"/>
        </b>
    </xsl:template>
</xsl:stylesheet>

Выход:

<div> Running text with marked up entities like<br/> <b>Entity1</b><br/> and, text in the middle too, and<br/> <b> Entity2 </b><br/></div>

Отображать как:

Запуск текста с размеченными объектами, такими как
Entity1
и текст посередине, и
Entity2


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

...