XSLT - сортировка части xml приводит к удалению других полей - PullRequest
0 голосов
/ 11 мая 2018

Я пытаюсь отсортировать часть xml.

Структура:

queryCompoundEmployeeResponse  
CompoundEmployee  
Person  
  fields...fields  
  fields...fields  
  fields...fields  
  EmploymentInformation  
    fields...fields  
    fields...fields  
          job_information  
          date...date  
          job_information  
          date...date  

Все, что мне нужно для сортировки, - это job_information в занятости_information.under job_information - это поле с именем end_date.

Проблема заключается в том, что поля с параметром jobs_information (который находится на том же уровне, что и job_information), удаляются из выходных данных.

Вот программа xslt

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" encoding="UTF-8" indent="yes"/>
  <xsl:template match="@* | node()">
    <xsl:copy>
       <xsl:apply-templates select="@* | node()"/>
    </xsl:copy>
  </xsl:template>

  <xsl:template match="employment_information">
    <xsl:copy>
      <xsl:apply-templates select="job_information">
      <!--  concat year, month, day -->
        <xsl:sort select="concat(
                  substring(end_date, 1, 4),
                  substring(end_date, 6, 2),
                  substring(end_date, 9, 2)

                  )" order="ascending"/>
      </xsl:apply-templates>
    </xsl:copy>
  </xsl:template>
</xsl:stylesheet>

Ответы [ 2 ]

0 голосов
/ 23 января 2019

Спасибо за ваши ответы. Я смог решить это.

    enter code here

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" encoding="UTF-8" indent="yes"/>
  <xsl:template match="@* | node()">
    <xsl:copy>
       <xsl:apply-templates select="@* | node()"/>
    </xsl:copy>
  </xsl:template>

  <xsl:template match="employment_information">
    <xsl:copy>
      <xsl:apply-templates select="*[not(self::job_information)]"/>
      <xsl:apply-templates select="*[self::job_information]">
      <!--  concat year, month, day -->
        <xsl:sort select="concat(
                  substring(end_date, 1, 4),
                  substring(end_date, 6, 2),
                  substring(end_date, 9, 2)

                  )" order="ascending"/>
      </xsl:apply-templates>
    </xsl:copy>
  </xsl:template>
</xsl:stylesheet>
0 голосов
/ 11 мая 2018

Использование вами термина «удаленный» наводит на мысль о недопонимании того, как работает XSLT. Таблица стилей XSLT создает дерево результатов путем копирования или преобразования выбранной информации из исходного дерева. Если есть часть исходного дерева, которую ваша таблица стилей игнорирует, то она не будет присутствовать в результирующем дереве. Дело не в том, что он был удален, а в том, что вы не сделали ничего, что могло бы привести к его копированию.

В вашем шаблоне для employmentInformation вы копируете / преобразуете дочерние элементы jobInformation и игнорируете все остальное. Если вы хотите, чтобы другие дети были представлены в выходных данных, вам нужно что-то с ними сделать, например, xsl:apply-templates или xsl:copy.

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