2016-03-29 3 views
0

Я хочу сделать одно преобразование с помощью XSLT. В соответствии с приведенным ниже образцом доступно несколько EmpRecord, и каждый EmpRecord содержит EmpDept и профиль доступных сотрудников в рамках этого Департамента.для каждого цикла в XSLT

XML:

<Employee> 
    <EmpRecord> 
     <EmpDept>Accounting</EmpDept> 
     <EmpData> 
      <Name>Joy</Name> 
      <Age>32</Age> 
     </EmpData> 
    </EmpRecord> 
    <EmpRecord> 
     <EmpDept>Finance</EmpDept> 
    </EmpRecord> 
    <EmpRecord> 
     <EmpDept>IT</EmpDept> 
     <EmpData> 
      <Name>Sam</Name> 
      <Age>27</Age> 
     </EmpData> 
     <EmpData> 
      <Name>John</Name> 
      <Age>25</Age> 
     </EmpData> 
     <EmpData> 
      <Name>Ricky</Name> 
      <Age>31</Age> 
     </EmpData> 
    </EmpRecord> 
</Employee> 

Ожидаемый результат:

<Employee> 
    <EmpRecord> 
     <Department>Accounting</Department> 
     <EmpData> 
      <EmpName>Joy</EmpName> 
      <Age>32</Age> 
     </EmpData> 
    </EmpRecord> 
    <EmpRecord> 
     <Department>IT</Department> 
     <EmpData> 
      <EmpName>Sam</EmpName> 
      <Age>27</Age> 
     </EmpData> 
     <EmpData> 
      <EmpName>John</EmpName> 
      <Age>25</Age> 
     </EmpData> 
     <EmpData> 
      <EmpName>Ricky</EmpName> 
      <Age>31</Age> 
     </EmpData> 
    </EmpRecord> 
</Employee> 

Я могу получить все доступные EmpData, но не может принести EmpDept.

XSLT используется:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:template match="/"> 
<Employee> 
<xsl:for-each select="/Employee/EmpRecord/EmpData"> 
<Department><xsl:value-of select="./EmpDept"/></Department> 
<EmpData> 
<EmpName><xsl:value-of select="./Name"/></EmpName> 
<Age><xsl:value-of select="./Age"/></Age> 
</EmpData> 
</xsl:for-each> 
</Employee> 

</xsl:template> 
</xsl:stylesheet> 

Так что я хочу только те EmpDept, который имеет по крайней мере один сотрудник отсутствует.

ответ

2

Попробуй так:

XSLT 1,0

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

<xsl:template match="/Employee"> 
    <Employee> 
     <xsl:for-each select="EmpRecord[EmpData]"> 
      <EmpRecord> 
       <Department> 
        <xsl:value-of select="EmpDept"/> 
       </Department> 
       <xsl:for-each select="EmpData"> 
        <EmpData> 
         <EmpName> 
          <xsl:value-of select="Name"/> 
         </EmpName> 
         <xsl:copy-of select="Age"/> 
        </EmpData> 
       </xsl:for-each> 
      </EmpRecord> 
     </xsl:for-each> 
    </Employee> 
</xsl:template> 

</xsl:stylesheet> 

Или, если вы предпочитаете:

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/> 
<xsl:strip-space elements="*"/> 

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

<xsl:template match="EmpRecord[not(EmpData)]"/> 

<xsl:template match="EmpDept"> 
    <Department> 
     <xsl:apply-templates/> 
    </Department> 
</xsl:template> 

<xsl:template match="Name"> 
    <EmpName> 
     <xsl:apply-templates/> 
    </EmpName> 
</xsl:template> 

</xsl:stylesheet> 
0

Что вы на самом деле хотите сделать: скопируйте все из источника в целевой xml, кроме EmpRecord, не содержащий EmpData. Правильно? Попробуйте следующее:

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

«шаблон идентификации» копирует все, «определенная часть» удаляет нежелательные элементы.

+0

Извините, если мой ожидаемый результат, вводит в заблуждение, на самом деле я не хочу чтобы точно копировать. В моей реальной работе требуется изменение тегов и структуры. –

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