Надеюсь, кто-то может дать мне руку. Эта проблема уже несколько дней утомляет меня. Корень моей проблемы заключается в том, что я хочу добавить разметку ко всем узлам в порядке документов между двумя элементами.Код XSLT, необходимый для стилизации текста между двумя элементами
У меня есть документ, который имеет XML, похожее на это:
<Employees>
<Employee>
<Title>Mr.</Title>
<FirstName>John</FirstName>
<LastName>Doe</LastName>
</Employee>
<Employee>
<Title>Mr.</Title>
<FirstName>Tom</FirstName>
<LastName>Doe</LastName>
</Employee>
</Employees>
Когда я использую функцию Oracle в «разметке», который помечает до поиска хитов, и я искать строку «John Doe», я получаю XML-результат выглядит следующим образом:
<Employees>
<Employee>
<Title>Mr.</Title>
<FirstName><hitStart/>John</FirstName>
<LastName>Doe<hitEnd/></LastName>
</Employee>
<Employee>
<Title>Mr.</Title>
<FirstName>Tom</FirstName>
<LastName>Doe</LastName>
</Employee>
</Employees>
Я хочу преобразовать это в XHTML, который выделяет хит. Например, следующий XHTML будет полезным результатом:
<TABLE>
<TR>
<TD>Mr. <b style="color:red">John Doe</b></TD>
<TR>
<TR>
<TD>Tom Doe</TD>
</TR>
</TABLE>
Я попытался написание таблиц стилей, которые используют применяемые-шаблоны или именованные шаблоны для навигации по документу, но я не могу заставить их работать. Использование шаблонов apply сложно, потому что я не могу передать параметр, указывающий, находятся ли узлы в элементах hitStart и hitEnd. Использование именованных шаблонов сложно, потому что мне нужно обрабатывать текстовые и элементные узлы по-разному, чего я не могу сделать в XSLT 1.0. Помощь была бы оценена.
Спасибо, Brian
Спасибо всем, кто помог !!!! Вы, ребята, здорово!
Вот что я остановился на:
<xsl:template match="/*|node()">
<xsl:copy>
<xsl:apply-templates select="@*"/>
<xsl:apply-templates select="node()[1]"/>
</xsl:copy>
<xsl:apply-templates select="following-sibling::node()[1]"/>
</xsl:template>
<xsl:template match="text()[preceding::*[self::hitStart or self::hitEnd][1][self::hitStart]
and following::*[self::hitStart or self::hitEnd][1][self::hitEnd]]">
<span style="color:red;font-style:italic;font-weight:bold"><xsl:value-of select="."/></span>
<xsl:apply-templates select="following-sibling::node()[1]"/>
</xsl:template>
<xsl:template match="hitStart|hitEnd">
<xsl:apply-templates select="following-sibling::node()[1]"/>
</xsl:template>
brianv, я полностью изменил ответ с помощью нового решения. Это лучше сейчас? :) –
Отлично, Dimitre !! Огромное спасибо. Это сделал трюк. Поскольку мой реальный XML-атрибут имеет атрибуты, даже на корневом узле, я сделал несколько настроек.Вот что работает для меня: – brianv
' xsl: template> xsl: template> ' –
brianv