Фильтрация и сортировка по группе XSL - PullRequest
0 голосов
/ 07 февраля 2019

Я пытаюсь отфильтровать и организовать список людей со своими вложениями.Люди могут иметь несколько вложений, которые были прикреплены или изменены в разное время, или вообще не иметь вложений.Я хочу только одну привязанность на человека.Если у человека есть вложение, содержащее слово резюме, я хочу, чтобы последнее изменилось.Если у человека нет вложения с резюме на имя которого вложение было изменено последним.И если нет резюме, мы все равно хотим включить этого человека, но оставим эти элементы пустыми.

В настоящее время я пытаюсь отсортировать по FileLastModDate, но это не работает.

    <?xml version="1.0" encoding="UTF-8"?>
    <ExportXML xmlns="http://www.taleo.com/ws/integration/toolkit/2005/07" xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:ns1="http://www.taleo.com/ws/integration/toolkit/2005/07" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
        <record>
            <field name="FirstName">Olivia</field>
            <field name="LastName">Test</field>
            <field name="Number">1</field>
            <field name="FileName">Olivia Test 2017.pdf</field>
            <field name="FileLastModDate">2017-06-20T19:24:51-04:00</field>
        </record>
        <record>
            <field name="FirstName">Olivia</field>
            <field name="LastName">Tortolini</field>
            <field name="Number">1</field>
            <field name="FileName">Olivia Test 2018.pdf</field>
            <field name="FileLastModDate">2018-06-20T19:24:51-04:00</field>
        </record>
        <record>
            <field name="FirstName">Kevin</field>
            <field name="LastName">X</field>
            <field name="Number">2</field>
            <field name="FileName">cover letter 2018.docx</field>
            <field name="FileLastModDate">2018-10-04T13:32:30-04:00</field>
        </record>
        <record>
            <field name="FirstName">Kevin</field>
            <field name="LastName">X</field>
            <field name="Number">2</field>
            <field name="FileName">Resume 2018.docx</field>
            <field name="FileLastModDate">2018-09-04T13:32:30-04:00</field>
        </record>
        <record>
            <field name="FirstName">Kevin</field>
            <field name="LastName">X</field>
            <field name="Number">2</field>
            <field name="FileName">Resume 2017.docx</field>
            <field name="FileLastModDate">2017-12-26T15:47:54-05:00</field>
        </record>
        <record>
            <field name="FirstName">Michael</field>
            <field name="LastName">S</field>
            <field name="Number">3</field>
            <field name="FileName"></field>
            <field name="FileLastModDate"></field>
        </record>
    </ExportXML>

Я применяю сортировку к группе, но не получаю правильное имя файла

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
  xpath-default-namespace="http://www.taleo.com/ws/integration/toolkit/2005/07"  xmlns:ns="http://www.taleo.com/ws/integration/toolkit/2005/07"  xmlns:e="http://www.taleo.com/ws/tee800/2009/01" xmlns:fct="http://www.taleo.com/xsl_functions"  exclude-result-prefixes="e fct ns">
    <xsl:output indent="yes"/>
    <xsl:param name="OUTBOUND_FOLDER"/>
    <xsl:param name="NOW"/>
    <xsl:strip-space elements="*"/>
    <xsl:template match="/ExportXML">
        <Files>
            <xsl:for-each-group select="record" group-by="field[@name=('Number')]">
                <xsl:sort select="field[@name='FileLastModDate']"  order="descending"/>
                <xsl:variable name="FirstName" select="ns:field[@name='FirstName']"/>
                <xsl:variable name="LastName" select="ns:field[@name='LastName']"/>
                <xsl:variable name="LastModifiedDate" select="ns:field[@name='LastModifiedDate']"/>
                <xsl:variable name="Number" select="ns:field[@name='Number']"/>
                <xsl:variable name="FileName" select="field[@name='FileName']"/>
                    <file path="{$FileName}">
                        <FirstName>
                            <xsl:value-of select="$FirstName"/>
                        </FirstName>
                        <LastName>
                            <xsl:value-of select="$LastName"/>
                        </LastName>
                        <LastModifiedDate>
                            <xsl:value-of select="$LastModifiedDate"/>
                        </LastModifiedDate>
                        <Number>
                            <xsl:value-of select="$Number"/>
                        </Number>
                        <FileName>
                            <xsl:value-of select="$FileName"/>
                        </FileName>
                    </file>
            </xsl:for-each-group>      
        </Files>
    </xsl:template>
</xsl:stylesheet>

Я должен получить следующее:

<?xml version="1.0" encoding="UTF-8"?>
<Files>
   <file path="cover letter 2018.docx">
      <FirstName>Kevin</FirstName>
      <LastName>X</LastName>
      <LastModifiedDate/>
      <Number>2</Number>
      <FileName>Resume 2018.docx</FileName>
   </file>
   <file path="Olivia Test 2017.pdf">
      <FirstName>Olivia</FirstName>
      <LastName>Test</LastName>
      <LastModifiedDate/>
      <Number>1</Number>
      <FileName>Olivia Test 2018.pdf</FileName>
   </file>
   <file path="">
      <FirstName>Michael</FirstName>
      <LastName>S</LastName>
      <LastModifiedDate/>
      <Number>3</Number>
      <FileName/>
   </file>
</Files>

Вместо этого я получаю следующий результат

<?xml version="1.0" encoding="UTF-8"?>
<Files>
   <file path="cover letter 2018.docx">
      <FirstName>Kevin</FirstName>
      <LastName>X</LastName>
      <LastModifiedDate/>
      <Number>2</Number>
      <FileName>cover letter 2018.docx</FileName>
   </file>
   <file path="Olivia Test 2017.pdf">
      <FirstName>Olivia</FirstName>
      <LastName>Test</LastName>
      <LastModifiedDate/>
      <Number>1</Number>
      <FileName>Olivia Test 2017.pdf</FileName>
   </file>
   <file path="">
      <FirstName>Michael</FirstName>
      <LastName>S</LastName>
      <LastModifiedDate/>
      <Number>3</Number>
      <FileName/>
   </file>
</Files>

Ответы [ 2 ]

0 голосов
/ 07 февраля 2019

Это потенциально более «изящное» решение, которое включает в себя сначала сортировку записей, а сначала выходят резюме.

Попробуйте это XSLT

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
  xpath-default-namespace="http://www.taleo.com/ws/integration/toolkit/2005/07"
  xmlns:ns="http://www.taleo.com/ws/integration/toolkit/2005/07"
  xmlns:e="http://www.taleo.com/ws/tee800/2009/01"
  xmlns:fct="http://www.taleo.com/xsl_functions"
  exclude-result-prefixes="e fct ns">

  <xsl:output indent="yes"/>
  <xsl:param name="OUTBOUND_FOLDER"/>
  <xsl:param name="NOW"/>
  <xsl:strip-space elements="*"/>

  <xsl:template match="/ExportXML">
    <xsl:variable name="records">
      <xsl:perform-sort select="record">
        <xsl:sort select="matches(field[@name='FileName'], 'Resume', 'i')" order="descending"/>
        <xsl:sort select="field[@name='FileLastModDate']" order="descending"/>
      </xsl:perform-sort>
    </xsl:variable>

    <Files>
      <xsl:for-each-group select="$records/record" group-by="field[@name='Number']">
        <xsl:sort select="field[@name='FileLastModDate']" order="descending"/>

        <xsl:variable name="FirstName" select="field[@name='FirstName']"/>
        <xsl:variable name="LastName" select="field[@name='LastName']"/>
        <xsl:variable name="LastModifiedDate" select="field[@name='FileLastModDate']"/>
        <xsl:variable name="Number" select="field[@name='Number']"/>
        <xsl:variable name="FileName" select="field[@name='FileName']"/>

        <file path="{$FileName}">
          <FirstName>
            <xsl:value-of select="$FirstName"/>
          </FirstName>
          <LastName>
            <xsl:value-of select="$LastName"/>
          </LastName>
          <LastModifiedDate>
            <xsl:value-of select="$LastModifiedDate"/>
          </LastModifiedDate>
          <Number>
            <xsl:value-of select="$Number"/>
          </Number>
          <FileName>
            <xsl:value-of select="$FileName"/>
          </FileName>
        </file>
      </xsl:for-each-group>      
    </Files>
  </xsl:template>
</xsl:stylesheet>

Если ничего другого, это демонстрирует использование xsl:perform-sort, если вы не видели этого раньше.И, в качестве бонуса, показывает альтернативный способ выполнить проверку имени без учета регистра, используя вместо этого matches.

0 голосов
/ 07 февраля 2019

Вы можете заменить переменную

<xsl:variable name="FileName" select="field[@name='FileName']"/>

более сложной.Первый xsl:when предназначен для резюме, второй - для других вложений, а третий - для остальных - его можно опустить, но я добавлю его на случай, если вы захотите получить результат, отличный от ''.

<xsl:variable name="FileName">
    <xsl:choose>
        <xsl:when test="current-group()/field[@name='FileName'][contains(.,'Resume')]">
            <xsl:for-each select="current-group()/field[@name='FileName']">
                <xsl:sort select="contains(.,'Resume')" order="descending" />
                <xsl:if test="position() = 1">
                    <xsl:value-of select="."/>
                </xsl:if>
            </xsl:for-each>
        </xsl:when>
        <xsl:when test="current-group()/field[@name='FileName']">
            <xsl:for-each select="current-group()/field[@name='FileLastModDate']">
                <xsl:sort select="."  order="descending" />
                <xsl:if test="position() = 1">
                    <xsl:value-of select="../field[@name='FileName']"/>
                </xsl:if>
            </xsl:for-each>
        </xsl:when>
        <xsl:otherwise>
            <xsl:value-of select="''"/>
        </xsl:otherwise>
    </xsl:choose>
</xsl:variable>

Отказ от ответственности: могут быть и другие, более элегантные решения.


Чтобы сделать сравнения «Resume» без учета регистра, вы можете использовать функцию upper-case(...).а затем заменить все contains(.,'Resume') на

contains(upper-case(.),'RESUME')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...