2012-03-07 38 views
2

我正在嘗試從第三方來源獲取XML Feed並將其壓扁。展開第三方XML提要?

當前XML飼料類似於此:

<properties> 
    <property> 
     <idnumber></idnumber> 
     <location> 
      <region></region> 
      <street-address></street-address> 
      <city-name></city-name> 
      <state-code></state-code> 
      <zipcode></zipcode> 
      <latitude></latitude> 
      <longitude></longitude> 
     </location> 
     <details> 
      <name></name> 
      <status></status> 
      <price></price> 
      <bedrooms></num-bedrooms> 
      <bathrooms></bathrooms> 
      <lot-size></lot-size> 
      <square-feet></square-feet> 
      <property-type></property-type> 
      <attributes></attributes> 
      <description></description> 
     </details> 
     <pictures> 
      <picture> 
       <picture-url></picture-url> 
      </picture> 
    </property> 
</properties> 

不過,我真的需要扁平化XML這樣:

<properties> 
    <property> 
     <idnumber></idnumber> 
     <region></region> 
     <street-address></street-address> 
     <city-name></city-name> 
     <state-code></state-code> 
     <zipcode></zipcode> 
     <latitude></latitude> 
     <longitude></longitude> 
     <name></name> 
     <status></status> 
     <price></price> 
     <bedrooms></num-bedrooms> 
     <bathrooms></bathrooms> 
     <lot-size></lot-size> 
     <square-feet></square-feet> 
     <property-type></property-type> 
     <attributes></attributes> 
     <description></description> 
     <picture> 
       <picture-url></picture-url> 
     </picture> 
    </property> 
</properties> 

我一直在XLST樣式表讀數高達嘗試此,但是我是在浪費自己的時間,因爲原始Feed是由我無法編輯的第三方託管的?

回答

1

這將做你想做的。身份模板將所有內容複製到輸出中,而其他三個模板則會在複製其內容時導致省略二級標記。

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 

<xsl:output method="xml" indent="yes"/> 

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

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

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

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

</xsl:stylesheet> 
1

該轉化

<xsl:stylesheet version="1.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="node()|@*"> 
    <xsl:copy> 
    <xsl:apply-templates select="node()|@*"/> 
    </xsl:copy> 
</xsl:template> 

<xsl:template match="/*/*/*[*]"> 
    <xsl:apply-templates/> 
</xsl:template> 
</xsl:stylesheet> 

當所提供的XML文檔施加(校正爲進行良好的形成):

<properties> 
    <property> 
     <idnumber></idnumber> 
     <location> 
      <region></region> 
      <street-address></street-address> 
      <city-name></city-name> 
      <state-code></state-code> 
      <zipcode></zipcode> 
      <latitude></latitude> 
      <longitude></longitude> 
     </location> 
     <details> 
      <name></name> 
      <status></status> 
      <price></price> 
      <bedrooms></bedrooms> 
      <bathrooms></bathrooms> 
      <lot-size></lot-size> 
      <square-feet></square-feet> 
      <property-type></property-type> 
      <attributes></attributes> 
      <description></description> 
     </details> 
     <pictures> 
      <picture> 
       <picture-url></picture-url> 
      </picture> 
     </pictures> 
    </property> 
</properties> 

產生想要的,正確的輸出

<properties> 
    <property> 
     <idnumber/> 
     <region/> 
     <street-address/> 
     <city-name/> 
     <state-code/> 
     <zipcode/> 
     <latitude/> 
     <longitude/> 
     <name/> 
     <status/> 
     <price/> 
     <bedrooms/> 
     <bathrooms/> 
     <lot-size/> 
     <square-feet/> 
     <property-type/> 
     <attributes/> 
     <description/> 
     <picture> 
     <picture-url/> 
     </picture> 
    </property> 
</properties> 

說明:適當的使用和覆蓋the identity rule

+0

''缺少 – 2012-03-08 03:04:06

+0

@JimGarrison:好的觀察,修正。 :) – 2012-03-08 03:07:57