преобразование отображения xslt - фильтрация узлов - PullRequest
0 голосов
/ 17 января 2020

У меня проблема с созданием условия xslt, чтобы фильтр узла соответствовал самой последней информации о задании.

ниже xml input

<queryCompoundEmployeeResponse>
  <CompoundEmployee>
    <id>11111</id>
    <person>
      <employment_information>
        <job_information>
          <end_date>9999-12-31</end_date>
          <start_date>2017-05-17</start_date>
        </job_information>
        <job_information>
          <end_date>2018-12-31</end_date>
          <start_date>2017-05-17</start_date>
        </job_information>
      </employment_information>
    </person>
  </CompoundEmployee>
</queryCompoundEmployeeResponse>

вот xml output Я хотел бы иметь

<queryCompoundEmployeeResponse>
  <CompoundEmployee>
    <id>11111</id>
    <person>
      <employment_information>
        <job_information>
          <end_date>9999-12-31</end_date>
          <start_date>2017-05-17</start_date>
        </job_information>
      </employment_information>
    </person>
  </CompoundEmployee>
</queryCompoundEmployeeResponse>

здесь xslt input

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xs="http://www.w3.org/2001/XMLSchema" exclude-result-prefixes="xsl xs">
    <xsl:output omit-xml-declaration="yes" indent="yes"/>
    <xsl:strip-space elements="*"/>

 <xsl:template match="node()|@*">
  <xsl:copy>
   <xsl:apply-templates select="node()|@*"/>
  </xsl:copy>
 </xsl:template>


<!--remove all employees with past and previous dalta to have only current data-->

 <xsl:template match="//queryCompoundEmployeeResponse/CompoundEmployee/person/employment_information/job_information[((start_date &lt; current-date()) and (job_information/end_date &gt; current-date()))]"/>


</xsl:stylesheet>

Правило простое: последний узел job_information всегда находится на вершине xml, и я хотел бы У меня есть только самая последняя информация о задании xml.

Он отлично работает с фильтром xpath:

/queryCompoundEmployeeResponse/CompoundEmployee[(person/employment_information/job_information[1])]

, но мне нужно иметь условие xpath внутри условия xslt относительно start_date и end_date .

Вы можете мне помочь?

1 Ответ

0 голосов
/ 17 января 2020

Ваш шаблон должен соответствовать любому <job_information>, который имеет дату окончания в прошлом.

<xsl:template match="job_information[xs:date(end_date) &lt; current-date()]" />

Я думаю, нет необходимости делать его более сложным, чем этот.

Примечание что нет необходимости делать выражение match полностью квалифицированным. Вышеупомянутое применимо к любому <job_information>, независимо от того, насколько глубоко оно может быть вложено.

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