Отображать повторяющиеся теги в XSLT?

#java #xml #xslt

#java #xml #xslt

Вопрос:

Я работаю с проектом CV, используя XML для хранения резюме, используя XSLT и Java для преобразования его в HTML.

Ниже приведен формат XML-файла

 <CVs>
<cv>
<name>...</name>
<dob>...</dob>
<experience>
<job>.....</job>
<job>.....</job>
</experience>
</cv>
<cv>
<name>...</name>
<dob>...</dob>
<experience>
<job>.....</job>
<job>.....</job>
<job>.....</job>
<job>.....</job>
<job>.....</job>
</experience>
</cv>
</CVs>
  

Как правильно отображать <job> повторяющиеся теги? Я получаю только один <job> , и это первый…

Хорошего дня, Джон


Большое спасибо за ваш ответ. 🙂

Я попробовал первое решение. Это работает. Но то, что я хочу, это отобразить все с форматированием абзаца HTML.

Сначала отобразите № 1, затем должен быть абзац, затем № 2 и так далее. Нравится-

 <p>Job No1</p>
<p>Job No2</p>
  

Я использовал следующее — с ошибкой получить требуемый результат..

 <xsl:for-each select="Job">
<p style="color:red">
<xsl:if test="position() amp;> 1">,</xsl:if>
<xsl:value-of select="."/>
</p>
</xsl:for-each> 
  

Используя приведенный выше код, я получаю вывод, подобный —

 <p>Job No1 job No2..</p>
  

Я использую XSLT 1.0, о котором я упоминал, чтобы забыть в первом сообщении. Извините за это, но вы судили об этом .. Хммм, огромный опыт работы с XSLT .. Отлично..

Можете ли вы мне снова помочь ..?

Хорошего дня, Джон


Ларш — Правильно сказал, я должен был сделать все это в самом первом сообщении, но почему-то не могу с этим справиться. Теперь я практиковал методы публикации и в дальнейшем буду делать это правильно. 🙂

Кроме того, я принял ответ Мартина. Это сделало свое дело, с небольшими изменениями я получил ответ на 2-й мой пост.

Большое спасибо всем вам…

Хорошего дня, Джон

Комментарии:

1. Вопрос слишком расплывчатый, чтобы попытаться дать полезный ответ. Пожалуйста, покажите ваш текущий код XSLT. (Я думаю, вы достаточно ясно дали понять, какой результат вам нужен и какой результат вы получаете в данный момент.)

2. @LarsH: он есть, но не отформатирован. В OP говорится: «Как правильно отображать <job> повторяющиеся теги?» но <job> он не отформатирован так, как должен. Я предполагаю, что @Martin Honnen мог отредактировать вопрос. Я делаю это сейчас.

3. @Dimitre: наличие <job> видимого помогает, но я спрашивал его код XSLT.

4. @LarsH: всякий раз, когда кто-то говорит, что они получают только 1-й узел, это почти на 100% <xsl:value-of> против <xsl:copy-of> 🙂

5. @Dimitre: да. Я просто подумал, что было бы проще исправить проблему с учетом специфики, основанной на контексте его кода, вместо того, чтобы тратить время на общие объяснения, которые ему может быть трудно применить — или вообще не могут быть применимы, если его проблема более тонкая. В принципе, я чувствую, что это базовый уровень рассмотрения, когда спрашивают «Что не так с моим кодом?», Чтобы показать некоторый код. Я думаю, это подтверждается новым ответом Джона, что ответ Мартина не совсем применим к его коду … который он сейчас показывает.

Ответ №1:

Я думаю, проблема в том, что с XSLT 1.0 (или с процессором XSLT 2.0, выполняющим таблицу стилей XSLT 1.0 в режиме обратной совместимости) код

 <xsl:value-of select="job"/>
  

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

 <xsl:for-each select="job">
  <xsl:if test="position() amp;> 1">, </xsl:if>
  <xsl:value-of select="."/>
</xsl:for-each>
  

или <xsl:apply-templates select="job"/> с шаблоном для элементов задания, например

 <xsl:template match="job">
  <xsl:if test="position() amp;> 1">, </xsl:if>
  <xsl:value-of select="."/>
<xsl:template>
  

в то время как с XSLT 2.0 все, что вам нужно, это <xsl:value-of select="job" separator=", "/> .

Комментарии:

1. Хорошая работа, чтобы выяснить, что имел в виду пользователь … 1