2010-08-26 80 views
2

我對XSLT一無所知,但我需要一次性的東西。這應該很簡單。 XSLT需要做什麼才能進行如下所示的以​​下輸入和顯示。需要幫助使用XSLT從XML輸出文本節點

INPUT:

<TestResult> 
<set-value idref="account_lockout_duration_var">900</set-value> 
<set-value idref="account_lockout_threshold_var">5</set-value> 
    <group> 
     <id>345</id> 
     <id>265</id> 
     <field>true</field> 
     <message>dont do that</message> 
    </group> 
    <group> 
     <id>333</id> 
     <field>false</field> 
    </group> 
</TestResult> 

OUTPUT

345,265,true 
333,false 

這僅僅是一個代碼段,只能有每組一個磁場元件,但ID元件是未結合的。

我修改了輸入,使用下面的答案,我得到額外的輸出(一切都是輸出,當我只想要ID和域元素 感謝

回答

2

我會做這樣的事情:

XML:

<TestResult> 
    <set-value idref="account_lockout_duration_var">900</set-value> 
    <set-value idref="account_lockout_threshold_var">5</set-value> 
    <group> 
    <id>345</id> 
    <id>265</id> 
    <field>true</field> 
    <message>dont do that</message> 
    </group> 
    <group> 
    <id>333</id> 
    <field>false</field> 
    </group> 
</TestResult> 

XSL:

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

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

    <xsl:template match="/TestResult/group"> 
    <xsl:apply-templates/> 
    <xsl:if test="following-sibling::group"> 
     <xsl:text>&#xA;</xsl:text> 
    </xsl:if> 
    </xsl:template> 

    <xsl:template match="/TestResult/group/id|field"> 
    <xsl:value-of select="."/> 
    <xsl:if test="following-sibling::id or following-sibling::field">,</xsl:if> 
    </xsl:template> 

</xsl:stylesheet> 

OUT:

345,265,true 
333,false 
+0

謝謝,看我的編輯。 – user318747 2010-08-26 16:17:56

+0

我更新了我的答案以供您修改。 – 2010-08-26 16:27:39

+0

我認爲你的規則'xsl:template match =「node()| @ *」'並不是真的需要。查看我的答案以獲得更簡潔的代碼。 – 2010-08-26 19:32:45

1

這將是這樣的:。

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> 
    <xsl:output method="text" encoding="UTF-8" omit-xml-declaration="yes"/> 
    <xsl:template match="/"> 
    <xsl:apply-templates/> 
    </xsl:template> 
    <xsl:template match="group"> 
    <xsl:apply-templates/> 
    </xsl:template> 
    <xsl:template match="id"> 
    <xsl:apply-templates/> 
    <xsl:text>;</xsl:text> 
    </xsl:template> 
    <xsl:template match="field"> 
    <xsl:apply-templates/> 
    <xsl:text> 
</xsl:text> 
    </xsl:template> 
</xsl:stylesheet> 
+0

謝謝,看我的編輯。 – user318747 2010-08-26 16:18:21

1

該樣式表:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output method="text"/> 
    <xsl:template match="group/*[not(self::message)]"> 
     <xsl:value-of select="concat(.,substring(',&#xA;', 
               1 + boolean(self::field), 
               1))"/> 
    </xsl:template> 
    <xsl:template match="text()"/> 
</xsl:stylesheet> 

輸出:

345,265,true 
333,false 
+0

@Alejandro:不錯的緊湊代碼。 +1 – 2010-08-26 19:54:49