2016-11-16 3 views
0

Я новичок в XSL. Поэтому, пожалуйста, помогите мне с ниже. У меня 2 xmls. Я должен сделать следующее в преобразовании XSL.Сравнить данные 2 xmls в xslt

, если служащий/EmployeeInfo/FirstName = EmployeeSegment/EmployeeSummary/GivenName и служащий/EmployeeInfo/ЬазШате = EmployeeSegment/EmployeeSummary/Фамилия EmployeeID = EmployeeSegment/EmployeeSummary/EmpId

XML1

<Employee> 
    <EmployeeInfo> 
    <FirstName>ABC</FirstName> 
    <LastName>DEF</LastName> 
    </EmployeeInfo> 
</Employee> 

xml2

<EmployeeSegment> 
    <EmployeeSummary> 
    <EmpId>1234</EmpId> 
    <GivenName>ABC</GivenName> 
    <Surname>DEF</Surname> 
    </EmployeeSummary> 
</EmployeeSegment> 

Я пробовал следующее. Это не работает.

<xsl:param name="cjEmployeeSegment" select="document('CJ_Response.xml')"/> 
<xsl:for-each select="/ns3:Employee/ns3:EmployeeInfo"> 
    <xsl:variable name="empFirstName"> 
     <xsl:value-of select="ns1:FirstName"/> 
    </xsl:variable> 
    <xsl:variable name="empLastName"> 
     <xsl:value-of select="ns1:LastName"/> 
    </xsl:variable> 
    <xsl:for-each select="$cjEmployeeSegment/v32:EmployeeSegment/v31:EmployeeSummary"> 
    <xsl:if test="$empFirstName=v31:GivenName and $empLastName=v31:Surname"> 
     <ns12:EmployeeIdentifier> 
     <ns12:EmployeeID> 
      <xsl:value-of select="v31:EmpId"/> 
     </ns12:EmployeeID> 
     </ns12:EmployeeIdentifier> 
    </xsl:if> 
    </xsl:for-each> 
</xsl:for-each> 
+0

Совет кодирования: замените способ установки empFirstName на ''. Это более краткий и может быть в 5 раз быстрее. –

+0

SO tip: никогда не говорите, что «не работает». Скажите, как это не удается. –

ответ

1

Предполагая, что вы обрабатываете следующий вход:

XML

<Employee> 
    <EmployeeInfo> 
    <FirstName>ABC</FirstName> 
    <LastName>DEF</LastName> 
    </EmployeeInfo> 
</Employee> 

и есть другой XML-документ с именем CJ_Response.xml:

<EmployeeSegment> 
    <EmployeeSummary> 
    <EmpId>1234</EmpId> 
    <GivenName>ABC</GivenName> 
    <Surname>DEF</Surname> 
    </EmployeeSummary> 
</EmployeeSegment> 

вы можете использовать следующие таблица стилей:

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:param name="cj_Response" select="document('CJ_Response.xml')"/> 

<xsl:template match="/Employee"> 
    <root> 
     <xsl:for-each select="EmployeeInfo"> 
      <xsl:variable name="lookup" select="$cj_Response/EmployeeSegment/EmployeeSummary[GivenName = current()/FirstName and Surname = current()/LastName]" /> 
      <xsl:if test="$lookup"> 
       <EmployeeIdentifier> 
        <EmployeeID> 
         <xsl:value-of select="$lookup/EmpId"/> 
        </EmployeeID> 
       </EmployeeIdentifier> 
      </xsl:if> 
     </xsl:for-each> 
    </root> 
</xsl:template> 

</xsl:stylesheet> 

вернуться:

<?xml version="1.0" encoding="UTF-8"?> 
<root> 
    <EmployeeIdentifier> 
     <EmployeeID>1234</EmployeeID> 
    </EmployeeIdentifier> 
</root> 

Конечно, это не ужасно, если есть два или более сотрудников с тем же именем.

+0

@ user2682527 Если на ваш вопрос ответили, пожалуйста, закройте его, приняв ответ. –