2015-06-26 2 views
0

Привет Я пытаюсь выполнить сложное отображение, используя одну трансформацию XSLT. Но я пробовал - каждый и применять шаблоны, даже не мог приблизиться к требованию.Группировка, фильтрация и отображение определенных элементов с использованием XSLT

Ниже приведены условия.

1) Группа элементы работника по конкатенации FirstName, LastName и DeptNo

2) уникальный элемент служащего Если первичный контакт 'Y' карта соответствующих записей Мобильного телефона с Target

3) Если PrimaryConcat элемент со значением «Y» нет, тогда отобразите номер мобильного телефона из записи сотрудника, где значение PrimaryConcat равно «N»

4) Если оба «Y» и «N» отсутствуют, Dont сопоставьте номер мобильного телефона

На вкладке будет указано более миллиона элементов Employee с адресом, контактными данными и т. Д. Я привел здесь пример только с мобильным номером.

Благодаря

ВХОДА XML

<Employees> 
    <Employee> 
     <PrimaryContact>Y</PrimaryContact> 
     <Name> 
      <FirstName>Paul</FirstName> 
      <LastName>Hecht</LastName> 
     </Name> 
     <DeptNo>10008072</DeptNo> 
     <MobNo>78952646</MobNo> 
    </Employee> 
    <Employee> 
     <PrimaryContact>N</PrimaryContact> 
     <endDate>0001-01-15T00:00:00.000Z</endDate> 
     <Name> 
      <FirstName>Paul</FirstName> 
      <LastName>Hecht</LastName> 
     </Name> 
     <DeptNo>10008072</DeptNo> 
     <MobNo>54646544</MobNo> 
    </Employee> 
    <Employee> 
     <PrimaryContact/> 
     <Name> 
      <FirstName>Chris</FirstName> 
      <LastName>Grey</LastName> 
     </Name> 
     <DeptNo>10001760</DeptNo> 
     <MobNo>1378956</MobNo> 
    </Employee> 
    <Employee> 
     <PrimaryContact>N</PrimaryContact> 
     <Name> 
      <FirstName>Chris</FirstName> 
      <LastName>Grey</LastName> 
     </Name> 
     <DeptNo>10001760</DeptNo> 
     <MobNo>78941236</MobNo> 
    </Employee> 
    <Employee> 
     <PrimaryContact/> 
     <Name> 
      <FirstName>Jessica</FirstName> 
      <LastName>Thruman</LastName> 
     </Name> 
     <DeptNo>10008022</DeptNo> 
     <MobNo>7895264446</MobNo> 
    </Employee> 
    <Employee> 
     <PrimaryContact/> 
     <Name> 
      <FirstName>Jessica</FirstName> 
      <LastName>Thruman</LastName> 
     </Name> 
     <DeptNo>10008022</DeptNo> 
     <MobNo>5464786544</MobNo> 
    </Employee> 
</Employees> 

ЗАПЛАНИРОВАННЫЕ:

<Employees> 
    <Employee> 
     <Name> 
      <FirstName>Paul</FirstName> 
      <LastName>Hecht</LastName> 
     </Name> 
     <MobNo>78952646</MobNo> 
    </Employee> 
    <Employee> 
     <Name> 
      <FirstName>Chris</FirstName> 
      <LastName>Grey</LastName> 
     </Name> 
     <MobNo>78941236</MobNo> 
    </Employee> 
    <Employee> 
     <Name> 
      <FirstName>Jessica</FirstName> 
      <LastName>Thruman</LastName> 
     </Name> 
     <MobNo/> 
    </Employee> 
</Employees> 

ответ

0

Предполагая, что процессор XSLT 2.0, как Saxon 9 я пытался реализовать ваше описание в качестве http://xsltransform.net/bdxtqL/1, который делает

<?xml version="1.0" encoding="UTF-8" ?> 
<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0"> 
    <xsl:output method="xml" encoding="UTF-8" indent="yes" /> 

    <xsl:template match="Employees"> 
     <xsl:copy> 
      <xsl:for-each-group select="Employee" group-by="string-join((Name/(FirstName, LastName), DeptNo), '|')"> 
       <xsl:copy> 
        <xsl:copy-of select="Name"/> 
        <MobNo> 
         <xsl:value-of select="(current-group()[PrimaryContact = 'Y']/MobNo, current-group()[PrimaryContact = 'N']/MobNo)[1]"/> 
        </MobNo> 
       </xsl:copy> 
      </xsl:for-each-group> 
     </xsl:copy> 
    </xsl:template> 

</xsl:transform> 

Один из MobNo не похож на ваш желаемый образец результата, я не уверен, не полностью ли я понял ваши требования или не был ли этот образец неправильным.

Смежные вопросы