2015-04-01 179 views
-2

我有一個嵌套的層次結構xml結構,使用xsl轉換進行展開。以下是該場景。使用XSLT轉換平展嵌套的XML /層次結構

<company> 
    <Managers> 
    <Manager> 
     <Name>Matt</Name> 
     <ID>1</ID> 
     <Manager> 
      <Name>Joe</Name> 
      <ID>11</ID> 
      <Manager> 
      <Name>Dave</Name> 
      <ID>111</ID> 
     </Manager> 
     </Manager> 
    </Manager> 
    <Manager> 
     <Name>mike</Name> 
      <ID>2</ID>> 
    </Manager> 
    </Managers> 
</company> 

結果:

Matt 1 
Joe 11 
Dave 111 
Mike 2 
+1

所以你試過_anything_?閱讀任何教程?你的困難究竟是什麼? – DavidS 2015-04-01 14:52:50

+0

嗯。是啊。我有點擔心問題是什麼是適當的XPath。 XSLT非常簡單。今後,最好張貼您嘗試過的樣本 – 2015-04-01 14:55:56

+0

請不要做標籤垃圾郵件並限制爲直接相關的標籤。 – 2015-04-01 16:16:12

回答

1

通過@Mathias穆勒一個更好的選擇,

<?xml version="1.0" encoding="UTF-8" ?> 
<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> 
    <xsl:output method="text" encoding="UTF-8"/> 

    <xsl:template match="Manager"> 
     <xsl:value-of select="Name" /> 
     <xsl:text>: </xsl:text> 
     <xsl:value-of select="ID" /> 
     <xsl:text> </xsl:text> 
     <xsl:apply-templates/> 
    </xsl:template> 

    <xsl:template match="text()"/> 

</xsl:transform> 

爲什麼這是更好的:它會更正確地控制文本輸出(假設你真的想將其輸出爲純文本格式)。它也是更多的面向XSLT模板,與環繞着的for-each環相比,它更易於擴展和維護。

使用descendant-or-self軸:

<?xml version="1.0" encoding="UTF-8" ?> 
<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> 
    <xsl:output method="text" doctype-public="XSLT-compat" omit-xml-declaration="yes" encoding="UTF-8" indent="yes" /> 

    <xsl:template match="//Managers"> 
     <xsl:for-each select="descendant-or-self::Manager"> 
     <xsl:value-of select="Name" />: <xsl:value-of select="ID" /><xsl:text> </xsl:text> 
     </xsl:for-each> 
    </xsl:template>  

</xsl:transform> 

輸出:

Matt: 1 Joe: 11 Dave: 111 mike: 2 

http://xsltransform.net/nc4NzQB

+1

如果你在'xsl:text'內輸出一個空格字符,那麼爲什麼不把':'放在'xsl:text'裏呢?另外,我不認爲需要匹配'Managers',http://xsltransform.net/nc4NzQB/2。 – 2015-04-01 15:00:13

+0

我做了空格字符,因爲否則它會被吸收 - 但是:不。你的方法雖然更好,但我並不認爲在模板中使用了apply-templates。 – 2015-04-01 15:04:39