Сохранить несопоставленные узлы в шаблонах применения - PullRequest
0 голосов
/ 14 октября 2019

У меня есть требование сортировать записи на основе поля (аккаунта), только если другое поле (depositvalue) не пустое. Я могу сделать это, но мой текущий xslt удаляет несопоставленные узлы в шаблонах применения. Как всегда можно оставить все остальное нетронутым в этом случае. Сортируемая запись (DirectDeposit) может не всегда присутствовать для некоторых сотрудников.

Я уже достиг прогресса в сортировке.

XSLT:

   <xsl:stylesheet version = '1.0' 
   xmlns:xsl='http://www.w3.org/1999/XSL/Transform'>
<xsl:output omit-xml-declaration="no" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="Employee">
    <Employee>
        <xsl:apply-templates select="DirectDeposit[not(depositvalue = '')]" >
            <xsl:sort select="account"/>
        </xsl:apply-templates>
        <xsl:apply-templates select="DirectDeposit[depositvalue = '']"/>
    </Employee>
</xsl:template>
<xsl:template match="node()|@*">
    <xsl:copy>
        <xsl:apply-templates select="node()|@*"/>
    </xsl:copy>
</xsl:template>

фактический результат: (заголовок сотрудника пропал)

<?xml version="1.0"?>
 <Hire>
 <Employee>
 <DirectDeposit>
  <action>DirectDeposit</action>
  <created_by/>
  <created_on_timestamp>2018-07-13T19:46:58.000Z</created_on_timestamp>
  <date_of_birth>1985-04-09</date_of_birth>
  <account>2</account>
  <depositvalue>200</depositvalue>
 </DirectDeposit>
 <DirectDeposit>
  <action>DirectDeposit</action>
  <created_by/>
  <created_on_timestamp>2018-07-13T19:46:58.000Z</created_on_timestamp>
  <date_of_birth>1985-04-09</date_of_birth>
  <account>3</account>
  <depositvalue>100</depositvalue>
 </DirectDeposit>
 <DirectDeposit>
  <action>DirectDeposit</action>
  <created_by/>
  <created_on_timestamp>2018-07-13T19:46:58.000Z</created_on_timestamp>
  <date_of_birth>1985-04-09</date_of_birth>
  <account>1</account>
  <depositvalue/>
 </DirectDeposit>
 </Employee>
  <Employee/>
  </Hire>

Ожидается:

    <?xml version="1.0"?>
    <Hire>
  <Employee>
    <Header>
        <action/>
        <created_by/>
        <created_on_timestamp>2018-07- 
                 13T19:46:58.000Z</created_on_timestamp>
        <date_of_birth>1985-04-09</date_of_birth>
        <AdditionalElements/>
         </Header>
        <DirectDeposit>
        <action>DirectDeposit</action>
        <created_by/>
        <created_on_timestamp>2018-07- 
                   13T19:46:58.000Z</created_on_timestamp>
        <date_of_birth>1985-04-09</date_of_birth>
        <account>2</account>
        <depositvalue>200</depositvalue>
       </DirectDeposit>
         <DirectDeposit>
        <action>DirectDeposit</action>
        <created_by/>
        <created_on_timestamp>2018-07-13T19:46:58.000Z</created_on_timestamp>
        <date_of_birth>1985-04-09</date_of_birth>
        <account>3</account>
        <depositvalue>100</depositvalue>
    </DirectDeposit>
    <DirectDeposit>
        <action>DirectDeposit</action>
        <created_by/>
        <created_on_timestamp>2018-07-13T19:46:58.000Z</created_on_timestamp>
        <date_of_birth>1985-04-09</date_of_birth>
        <account>1</account>
        <depositvalue/>
    </DirectDeposit>
</Employee>
<Employee/>

1 Ответ

1 голос
/ 14 октября 2019

Добавьте

<xsl:apply-templates select="Header"/>

в шаблон match="Employee". Если вы не обработаете элемент Header, он не будет обработан и, следовательно, будет отсутствовать в выходных данных.

...