2011-08-10 45 views
2

我想將XML文檔轉換爲另一個XML文檔。我嘗試了各種方法,其中沒有一種產生所需的目標XML文檔。使用查找的XLST

我有這樣一個假設輸入XML文檔:

<rows> 
<row> 
    <name>ON</name> 
    <description/> 
</row> 
<row> 
    <name>NY</name> 
    <description/> 
</row> 
</rows> 

我也有兩個查找:

<loc:locations> 
<loc:location> 
    <loc:code>ON</loc:code> 
    <loc:value>Ontario</loc:value> 
</loc:location> 
<loc:location> 
    <loc:code>NY</loc:code> 
    <loc:value>New York</loc:value> 
</loc:location> 
</loc:locations> 

<des:descriptions> 
<des:description> 
    <des:code>ON</des:code> 
    <des:value>Ontario is a province in Canada</des:value> 
</des:description> 
<des:description> 
    <des:code>NY</des:code> 
    <des:value>New York is a state in the USA</des:value> 
</des:description> 
</des:descriptions> 

我想輸入的XML轉化爲這個目標XML:

<places> 
<place> 
    <name>Ontario</name> 
    <description>Ontario is a province in Canada</description> 
</place> 
<place> 
    <name>New York</name> 
    <description>New York is a state in the USA</description> 
</place> 
</places> 

什麼是可以實現這一目標的XSLT?謝謝!

回答

2

只是爲了清理東西可讀性,因爲你採取的命名空間約定,您還可以方便的查找所有的數據保存到一個變量。同時使用current()來訪問當前節點的name。避免//

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:loc="http://sample.com/location" 
    xmlns:des="http://sample.com/description" 
    version="1.0"> 

    <xsl:variable name="lookup" 
     select="document('locations.xml')/loc:locations/loc:location 
     | document('descriptions.xml')/des:descriptions/des:description"/> 

    <xsl:template match="rows"> 
     <places> 
      <xsl:apply-templates/> 
     </places> 
    </xsl:template> 

    <xsl:template match="row"> 
     <place> 
      <name> 
       <xsl:value-of select="$lookup[loc:code=current()/name]/ 
        loc:value"/> 
      </name> 
      <description> 
       <xsl:value-of select="$lookup[des:code=current()/name]/ 
        des:value"/> 
      </description> 
     </place> 
    </xsl:template> 

</xsl:stylesheet> 
+1

感謝empo,@greghmerrill。你的解決方案完美運作請注意,我必須從loc:locations和des:descriptions中刪除命名空間前綴。爲了克服「前綴未綁定」錯誤,我需要在兩個查找XML文檔的根上聲明xmlns屬性。 –

2

這個工作對我Xalan

<xsl:transform 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:loc="http://sample.com/location" 
    xmlns:des="http://sample.com/description" 
    version="1.0"> 

<xsl:output method="xml"/> 

<xsl:variable name="locations" select="document('locations.xml')/loc:locations/loc:location"/> 
<xsl:variable name="descriptions" select="document('descriptions.xml')/des:descriptions/des:description"/> 

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

<xsl:template match="//row"> 
    <xsl:variable name="name" select="name/text()"/> 
    <place> 
    <name><xsl:value-of select="$locations[loc:code = $name]/loc:value"/></name> 
    <description><xsl:value-of select="$descriptions[des:code = $name]/des:value"/></description> 
    </place> 
</xsl:template> 

</xsl:transform> 
+1

@empo在下面有一個更好的因素變體,請務必檢查一下。 – greghmerrill