Извлечение связанных тегов различных элементов в XML на основе некоторого условия равенства значений атрибутов с использованием XPATH и XSLT

Мне нужно каким-то образом извлечь данные из XML с помощью XPATH и XSLT

<data>      
    <person id="p1">         
        <name>User1</name>      
    </person>   
    <person id="p2">         
        <name>User2</name>      
    </person>  
    <person id="p3">         
        <name>User3</name>      
    </person>       
    <employee eid="emp1" pid="p1">         
        <dept>dept1</dept>      
    </employee> 
    <employee eid="emp2" pid="p3">         
        <dept>dept3</dept>      
    </employee>
    <employee eid="emp3" pid="p2">         
        <dept>dept1</dept>      
    </employee>
</data>

Из приведенного выше примера мне нужно создать XML-файлы каждого из них с элементами Person и соответствующими элементами Employee в выходном xml. Связь между этими двумя xmls

person.id = employee.pid

как XML1:

<person id="p1">         
<name>User1</name>      
</person>  
<employee eid="emp1" pid="p1">         
<dept>dept1</dept>      
</employee>

XML2:

<person id="p2">         
<name>User2</name>      
</person> 
<employee eid="emp3" pid="p2">         
 <dept>dept1</dept>      
</employee>

XML3:

<person id="p3">         
<name>User3</name>      
</person> 
<employee eid="emp2" pid="p3">         
<dept>dept3</dept>      
</employee>  

Я пробовал много способов, но не смог этого добиться.

Спасибо...


person user1760178    schedule 19.10.2012    source источник


Ответы (2)


XPath - это язык запросов для XML-документов, поэтому оценка выражения XPath не может изменить существующий документ или создать новый XML-документ.

То, что вы хотите, лучше всего может быть достигнуто с помощью XSLT 2.0 (XSLT 1.0, если требуется только один документ с результатами):

<xsl:stylesheet version="2.0"   xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output omit-xml-declaration="yes" indent="yes"/>
    <xsl:strip-space elements="*"/>

    <xsl:key name="kEmpByPid" match="employee" use="@pid"/>

 <xsl:template match="person">
  <xsl:result-document href="file:///c:/temp/delete/XML{position()}">
      <t>
             <xsl:copy-of select=".|key('kEmpByPid', @id)"/>
         </t>
     </xsl:result-document>
 </xsl:template>
 <xsl:template match="text()"/>
</xsl:stylesheet>

Когда это преобразование XSLT 2.0 применяется к предоставленному XML-документу:

<data>
    <person id="p1">
        <name>User1</name>
    </person>
    <person id="p2">
        <name>User2</name>
    </person>
    <person id="p3">
        <name>User3</name>
    </person>
    <employee eid="emp1" pid="p1">
        <dept>dept1</dept>
    </employee>
    <employee eid="emp2" pid="p3">
        <dept>dept3</dept>
    </employee>
    <employee eid="emp3" pid="p2">
        <dept>dept1</dept>
    </employee>
</data>

следующие три документа XML создаются в "c: \ temp \ delete":

XML1:

<t>
   <person id="p1">
      <name>User1</name>
   </person>
   <employee eid="emp1" pid="p1">
      <dept>dept1</dept>
   </employee>
</t>

XML2:

<t>
   <person id="p2">
      <name>User2</name>
   </person>
   <employee eid="emp3" pid="p2">
      <dept>dept1</dept>
   </employee>
</t>

XML3:

<t>
   <person id="p3">
      <name>User3</name>
   </person>
   <employee eid="emp2" pid="p3">
      <dept>dept3</dept>
   </employee>
</t>
person Dimitre Novatchev    schedule 19.10.2012

У меня есть решение для моей проблемы, приведенное ниже.

<xsl:stylesheet version="2.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output omit-xml-declaration="yes" indent="yes" />
    <xsl:strip-space elements="*" />

    <xsl:template match="//person">
        <xsl:variable name="ID" select="@id" />
        <xsl:result-document href="file:///c:/temp/delete/XML{position()}">
        <t>
            <xsl:copy-of select=". | //employee[@pid=$ID]" />
        </t>                
        </xsl:result-document>
    </xsl:template>
    <xsl:template match="text()" />
</xsl:stylesheet>

Просто хотел с вами поделиться.

Спасибо.

person user1760178    schedule 23.10.2012