#java #xml #xslt
#java #xml #xslt
Вопрос:
Ниже приведен мой XML-файл —
<CVs>
<CV>
<Name>ABC</Name>
<Address></Address>
<Introduction></Introduction>
<CompSkills>Java, XSLT, XPATH, XML, Oracle, VB.NET</CompSkills>
<Experience>
<Profile></Profile>
<Duration></Duration>
<Info></Info>
</Experience>
<Experience>
<Profile></Profile>
<Duration></Duration>
<Info></Info>
</Experience>
<Experience>
<Profile></Profile>
<Duration></Duration>
<Info></Info>
</Experience>
<CV>
<CV>
<Name>XYZ</Name>
<Address></Address>
<Introduction></Introduction>
<CompSkills>Java, XSLT, XPATH, XML, JSP, HTML</CompSkills>
<Experience>
<Profile></Profile>
<Duration></Duration>
<Info></Info>
</Experience>
<Experience>
<Profile></Profile>
<Duration></Duration>
<Info></Info>
</Experience>
<Experience>
<Profile></Profile>
<Duration></Duration>
<Info></Info>
</Experience>
<CV>
</CVs>
ниже приведен файл XSLT — краткая версия, чтобы получить представление
<xsl:template match="Name">
<table align='center' width='800' style="font-family:tahoma; font-size:13pt;">
<tr><td>
<xsl:apply-templates/>
</td></tr>
</table>
</xsl:template>
<xsl:template match="Experience">
<table align='center' width='800' style="font-family:tahoma; font-size:13pt;">
<tr><td>
<xsl:apply-templates/>
</td></tr>
</table>
</xsl:template>
Я использую Java в качестве интерфейса. Для отображения выходных данных в формате HTML у меня есть файл XSLT. Этот файл XSLT является стандартным ie; он отображает все резюме.
Теперь, что мне нужно сделать, это использовать список с именами всех кандидатов, и при нажатии на конкретное имя должно отображаться ТОЛЬКО его резюме. Я закодировал часть Java для отображения имен кандидатов в списке. Теперь возникли некоторые проблемы с отображением РЕЗЮМЕ выбранного кандидата в формате HTML.
В текущем файле XSLT отображаются все резюме. Так мне понадобится другой файл XSLT, который использует параметр, переданный из программы, и отображает его детали ..? Если да, то какая-нибудь помощь о том, как это сделать …??
Заранее спасибо — Джон
Комментарии:
1. Хороший вопрос, 1. Вам нужно передать выбранное имя в качестве глобального параметра для преобразования — тогда легко выполнить требуемое преобразование.
2. Димитр — Большое спасибо за ответ. Вы имеете в виду, что мне придется сначала извлечь требуемые совпадения в вывод XML, а затем передать этот файл в файл XSLT, чтобы получить вывод HTML ..? Еще раз большое спасибо за ответ. 🙂
3. @_John: Нет, я имел в виду, что в вашем коде, который вызывает преобразование, вы должны настроить параметр с требуемым именем CV (или *). Я не знаю, какой именно процессор Java XSLT вы используете. Я обычно использую . NET XslCompiledTransform и здесь описано, как настроить внешний параметр для преобразования: msdn.microsoft.com/en-us/library/… Для Saxon посмотрите на эти примеры приложений в документации Saxon: saxonica.com/documentation9.2/samples/intro.html
4. @_John: Что касается создания HTML, у вас не было ни одного полного образца желаемого результата. Вам нужно просто переопределить преобразование идентификатора с помощью дополнительных шаблонов , соответствующих элементам , которые являются потомками
CV
. Или вы могли бы написать это более аккуратно как двухэтапное преобразование, где мое решение является первым шагом, а второй шаг — форматирование HTML.5. @Dimitre- Я не получаю правильный вывод, как требуется ..!! Я использую JAXP, XSLT-процессор по умолчанию, который поставляется с JDK 1.7. Я сохраняю выходные данные в XML-файл, в котором я получаю только
<CVs/>
!!
Ответ №1:
Что вы можете сделать, это добавить xsl:param
в свой XSLT и присвоить ему значение по умолчанию; например, ‘All’ . Таким образом, по умолчанию он будет отображать все CV
s.
Если вам нужно отобразить одно CV
значение на основе a Name
, вы можете передать это значение (из своего списка) в свой xsl:param
, чтобы отобразить только это CV
.
Вот пример xsl:param
и xsl:template
необходимые для отображения CV
:
<xsl:param name="pName" select="'All'"/>
<xsl:template match="CV">
<xsl:if test="$pName = 'All' or Name = $pName">
<xsl:apply-templates/>
</xsl:if>
</xsl:template>
Если вы хотите отобразить только XYZ
CV, вы бы просто использовали значение XYZ
для pName
параметра при вызове XSLT.
Комментарии:
1. @DevNull- Спасибо за ответ. Я попробую и вернусь снова либо с благодарностями, либо с проблемами … 🙂
2. @John — Всегда пожалуйста, но, может быть, вы предпочли бы подождать, чтобы принять мой ответ? Я все же ценю это. 🙂
3. @DevNull- Хорошо, я отменил принятие.. После успешного выполнения данного кода я обязательно приму его .. Пожалуйста, не возражайте.
4. @John — Это лучший способ сделать это 🙂
Ответ №2:
Чтобы дать вам представление о том, как это можно сделать, вот полное решение, которое извлекает весь или только нужный CV
элемент (форматирование HTML не выполняется, поскольку это не имеет отношения к вопросу):
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:param name="pName" select="'XYZ'"/>
<xsl:template match="node()|@*" name="identity">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="CV">
<xsl:if test="$pName = Name or $pName='*'">
<xsl:call-template name="identity"/>
</xsl:if>
</xsl:template>
</xsl:stylesheet>
Когда это преобразование применяется к предоставленному XML-документу (исправленному на правильно сформированный):
<CVs>
<CV>
<Name>ABC</Name>
<Address></Address>
<Introduction></Introduction>
<CompSkills>Java, XSLT, XPATH, XML, Oracle, VB.NET</CompSkills>
<Experience>
<Profile></Profile>
<Duration></Duration>
<Info></Info>
</Experience>
<Experience>
<Profile></Profile>
<Duration></Duration>
<Info></Info>
</Experience>
<Experience>
<Profile></Profile>
<Duration></Duration>
<Info></Info>
</Experience>
</CV>
<CV>
<Name>XYZ</Name>
<Address></Address>
<Introduction></Introduction>
<CompSkills>Java, XSLT, XPATH, XML, JSP, HTML</CompSkills>
<Experience>
<Profile></Profile>
<Duration></Duration>
<Info></Info>
</Experience>
<Experience>
<Profile></Profile>
<Duration></Duration>
<Info></Info>
</Experience>
<Experience>
<Profile></Profile>
<Duration></Duration>
<Info></Info>
</Experience>
</CV>
</CVs>
создается требуемый, правильный (извлекается только CV
с Name
помощью XYZ):
<CVs>
<CV>
<Name>XYZ</Name>
<Address/>
<Introduction/>
<CompSkills>Java, XSLT, XPATH, XML, JSP, HTML</CompSkills>
<Experience>
<Profile/>
<Duration/>
<Info/>
</Experience>
<Experience>
<Profile/>
<Duration/>
<Info/>
</Experience>
<Experience>
<Profile/>
<Duration/>
<Info/>
</Experience>
</CV>
</CVs>
Объяснение:
Требуемое имя или «*» должно быть передано извне в качестве глобального параметра (в данном случае именованного pName
) для преобразования. Прочитайте документацию вашего процессора XSLT, как это должно быть сделано, поскольку это зависит от реализации.