Решит ли один файл XSLT эту проблему .. или …?

#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, как это должно быть сделано, поскольку это зависит от реализации.