Один файл XSLT решит эту проблему .. или ...? - PullRequest
4 голосов
/ 29 октября 2011

Ниже мой 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-файл является стандартным, т.е. он отображает все резюме.

Теперь, что мне нужно сделать, это использовать ListBox с именами всех кандидатов, и при нажатии на конкретное имя должно отображаться ТОЛЬКО его резюме. Я кодировал часть Java для отображения имен кандидатов в ListBox. Теперь возникли проблемы с отображением резюме выбранного кандидата в формате HTML.

В текущем файле XSLT отображаются все резюме. Так что мне понадобится другой XSLT-файл, который использует параметр, переданный из программы, и отображает его детали? Если да, то некоторая помощь о том, как это сделать ... ??

Заранее спасибо - Джон

Ответы [ 2 ]

3 голосов
/ 29 октября 2011

Что вы можете сделать, это добавить xsl:param к вашему XSLT и присвоить ему значение по умолчанию; «Все», например. Таким образом, по умолчанию будут отображаться все CV с.

Если вам нужно отобразить один CV на основе Name, вы можете передать это значение (из вашего ListBox) в xsl:param, чтобы отобразить только это CV.

Вот пример xsl:param и xsl:template, необходимые для отображения CV s:

  <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.

2 голосов
/ 29 октября 2011

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

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