使用来自另一个XML文件的数据转换XML

时间:2014-10-14 22:24:59

标签: php xml xslt transform

我有以下XML,以及包含ID类别的产品的文件。 xml的最后一行包含带有名称的ID类别和带有名称的父ID类别。

我需要更改名称的产品ID类别,并安排类别和父类别。 有输入XML:

<Export>  
<Products>   
<produkt>
<Nazev>forma 21cm skl.</Nazev>  
<Code>200011</Code>
<Kategorie>3</Kategorie>  
</produkt>   
</Products>   
</Export>   

<Categories>
<kategorie><id>1</id><ParentId></ParentId><Nazev>category1</Nazev></kategorie>   
<kategorie><id>2</id><ParentId>1</ParentId><Nazev>category2</Nazev></kategorie>   
<kategorie><id>3</id><ParentId>2</ParentId><Nazev>category3</Nazev></kategorie>
</Categories>  
</Export>  

这里是输出XML:

<Export> 
<Products>  
<produkt> 
<Nazev>forma 21cm skl.</Nazev>
<Code>200011</Code>
<Kategorie>category2 > category2 > category3</Kategorie>
</produkt>
</Products>  
</Export> 

但我不知道如何使用XSL或PHP脚本。

1 个答案:

答案 0 :(得分:0)

这是一个棘手的问题。试试这种方式:

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:strip-space elements="*"/>

<xsl:key name="kategorie" match="kategorie" use="id" />

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

<xsl:template match="Kategorie">
    <xsl:copy>
        <xsl:apply-templates select="key('kategorie', .)"/>
    </xsl:copy>
</xsl:template>

<xsl:template match="kategorie">
    <xsl:if test="key('kategorie', ParentId)">
        <xsl:apply-templates select="key('kategorie', ParentId)" />
        <xsl:text disable-output-escaping="yes"> > </xsl:text>
    </xsl:if>
    <xsl:value-of select="Nazev" />
</xsl:template>

<xsl:template match="Categories"/>

</xsl:stylesheet>

应用于格式良好的(!)输入

<Export>
  <Products>
    <produkt>
      <Nazev>forma 21cm skl.</Nazev>
      <Code>200011</Code>
      <Kategorie>3</Kategorie>
    </produkt>
  </Products>
  <Categories>
    <kategorie>
      <id>1</id>
      <ParentId/>
      <Nazev>category1</Nazev>
    </kategorie>
    <kategorie>
      <id>2</id>
      <ParentId>1</ParentId>
      <Nazev>category2</Nazev>
    </kategorie>
    <kategorie>
      <id>3</id>
      <ParentId>2</ParentId>
      <Nazev>category3</Nazev>
    </kategorie>
  </Categories>
</Export>

结果将是:

<?xml version="1.0" encoding="UTF-8"?>
<Export>
   <Products>
      <produkt>
         <Nazev>forma 21cm skl.</Nazev>
         <Code>200011</Code>
         <Kategorie>category1 > category2 > category3</Kategorie>
      </produkt>
   </Products>
</Export>