2014-09-22 4 views
0

Я недавно начал использовать XSLT. Я пытаюсь получить отчет об этом XML наборXSLT-карта другого дочернего элемента родительского узла

Один из XML выглядит, как показано ниже, и по имени (company_a.xml)

<company title="abc" > 
<section> 
<in-proc uid="HR.xml"> 
    <details> 
     <empname>abcd1</empname> 
     <id>xyz1</id> 
     <empname>abcd2</empname> 
     <id>xyz2</id> 
     <empname>abcd3</empname> 
     <id>xyz3</id> 
    </details> 
</in-proc>  
<out-proc uid="manufacturing.xml"> 
    <title>any</title> 
    <details> 
     <empname>abcd4</empname> 
     <id>xyz4</id> 
    </details> 
</out-proc> 
</section> 
</company> 

XSL используется

<?xml version="1.0" encoding="ISO-8859-1"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output omit-xml-declaration="yes"/> 
    <xsl:template match="/"> 
    <xsl:result-document href="Emp_data.csv"> 
      <xsl:for-each select="//file"> 
       <xsl:variable name="filename" select="."/> 
       <xsl:variable name="fileid" select="substring-before(., '.xml')"/> 
       <xsl:for-each select="document($filename)"> 
        <xsl:for-each select="company/section/*/details"> 
         <xsl:variable name="business" select="local-name(..)"/> 
         <xsl:variable name="dept" select="substring-before(ancestor::*/@uid, '.xml')"/> 
          <xsl:value-of select="concat('&quot;', id , '&quot;,&quot;', empname , '&quot;,&quot;', $fileid, '&quot;,&quot;', $dept, '&quot;,&quot;', $business, '&quot;&#xA;')"/> 
        </xsl:for-each> 
       </xsl:for-each> 
      </xsl:for-each> 
    </xsl:result-document> 
    </xsl:template> 
</xsl:stylesheet> 

дает

xyz1,abcd1,company_a,HR,in-proc 
xyz4,abcd4,company_a,manufacturing,out-proc 

Результаты Ищу является

xyz1,abcd1,company_a,HR,in-proc 
xyz2,abcd2,company_a,HR,in-proc 
xyz3,abcd3,company_a,HR,in-proc 
xyz4,abcd4,company_a,manufacturing,out-proc 

Я попытался с помощью

<xsl:for-each select="id"> 
    <xsl:value-of select="."/> 

, но тогда я не знаю, как принести EmpName

Я использую file_list (документ ($ имя_файла)), поскольку есть более 100 файлов, которые миллионы линий для просмотра

Прошу совета.

+0

Ваша таблица стилей объявляет XSLT версии 1.0, но вы используете XSLT 2.0 только элемент 'xsl: result-document'? –

+0

Хорошая добыча! В моей борьбе за решение я изменил это, но забыл вернуться. Я использую XSLT 2.0 – nexusEnthu

ответ

0

Если заменить

   <xsl:for-each select="company/section/*/details"> 
        <xsl:variable name="business" select="local-name(..)"/> 
        <xsl:variable name="dept" select="substring-before(ancestor::*/@uid, '.xml')"/> 
         <xsl:value-of select="concat('&quot;', id , '&quot;,&quot;', empname , '&quot;,&quot;', $fileid, '&quot;,&quot;', $dept, '&quot;,&quot;', $business, '&quot;&#xA;')"/> 
       </xsl:for-each> 

с

   <xsl:for-each select="company/section/*/details/empname"> 
        <xsl:variable name="business" select="local-name(../..)"/> 
        <xsl:variable name="dept" select="substring-before(ancestor::*/@uid, '.xml')"/> 
         <xsl:value-of select="concat('&quot;', following-sibling::id[1] , '&quot;,&quot;', . , '&quot;,&quot;', $fileid, '&quot;,&quot;', $dept, '&quot;,&quot;', $business, '&quot;&#xA;')"/> 
       </xsl:for-each> 

, то вы должны получить строку для каждого существующего empname.

+0

Отлично! Спасибо, Мартин – nexusEnthu