2012-09-26 167 views
0

我有一個XML文件:XSLT無法正常運行

<?xml version="1.0" encoding="utf-8" ?> 
<root> 
    <child> 
    <gc>gc1Value</gc> 
    </child> 
    <child>child2Value</child> 
    <child> 
    <gc>gc2Value</gc> 
    <gc>gc3Value</gc> 
    <gc> 
     <ggc>ggcValue</ggc> 
     <ggc>ggcValue</ggc> 
    </gc> 
    </child> 
</root> 

和XSLT文件:

<?xml version="1.0" encoding="utf-8"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:msxsl="urn:schemas-microsoft-com:xslt" exclude-result-prefixes="msxsl"> 
    <xsl:output method="xml" indent="yes"/> 
    <xsl:template match="/"> 
     <root> 
     <xsl:for-each select="root/child"> 
     <xsl:if test=".!=''"> 
      <value> 
      <xsl:value-of select="."/> 
      </value> 
     </xsl:if> 
     <xsl:for-each select="root/child/gc"> 
      <xsl:if test=".!=''"> 
      <value> 
       <xsl:value-of select="."/> 
      </value> 
      </xsl:if> 
      <xsl:for-each select="root/child/gc/ggc"> 
      <xsl:if test=".!=''"> 
       <value> 
       <xsl:value-of select="."/> 
       </value> 
      </xsl:if> 
      </xsl:for-each> 
     </xsl:for-each> 
     </xsl:for-each> 
     </root> 
    </xsl:template> 
</xsl:stylesheet> 

我希望看到這種結果:

<root> 
    <value>gc1Value</value> 
    <value>child2Value</value> 
    <value>gc2Value</value> 
    <value>gc3Value</value> 
    <value>ggcValue</value> 
    <value>ggcValue</value> 
</root> 

但我得到這個結果:

<?xml version="1.0" encoding="utf-8"?> 
<root> 
    <value> 
    gc1Value 
    </value> 
    <value>child2Value</value> 
    <value> 
    gc2Value 
    gc3Value 

     ggcValue 
     ggcValue 

    </value> 
</root> 

我認爲通過使用.作爲選擇,這隻會選擇當前節點的值,但它似乎也從兒童獲得值。我該怎麼做呢?

回答

1

的問題是在這裏:

<xsl:if test="gc!=''"> 
     <value> 
     <xsl:value-of select="."/> 
     </value> 
    </xsl:if> 

「」將獲得當前節點及其所有子節點。

使用node :: text()[ie。 select =「text()」]如果你只想要文本。另外,我會建議使用'字符串長度(節點)!= 0'和類似的而不是'',

+0

謝謝!這很好。 – khr055

0

您的問題與您的輸出。

 <value> 
     <xsl:value-of select="."/> 
     </value> 

您有換行符+空格+實際值+換行符+空格。

0

如果意圖是簡單地輸出所有文本節點爲元素,您可以採取更簡化這種方法適用於任何XML結構,無論元素名稱如何。

試試這個XSLT爲例。這依賴於內置的模板規則的元素,它只是處理它的子元素

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output method="xml" indent="yes"/> 

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

    <xsl:template match="text()"> 
     <value> 
     <xsl:value-of select="." /> 
     </value> 
    </xsl:template> 
</xsl:stylesheet> 

這也應該給你預期的結果。