2010-04-09 45 views
1

我有下面的XML:越來越屬性作爲列標題

<DEVICEMESSAGES> 
    <VERSION xml="1" checksum="" revision="0" envision="33050000" device="" /> 
    <HEADER id1="0001" id2="0001" content="Nasher[&lt;messageid&gt;]: &lt;!payload&gt;" /> 
    <MESSAGE level="7" parse="1" parsedefvalue="1" tableid="15" id1="24682" id2="24682" eventcategory="1003010000" content="Access to &lt;webpage&gt; was blocked due to its category (&lt;info&gt; by &lt;hostname&gt;)" /> 
</DEVICEMESSAGES> 

我使用以下XSLT:

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output method="text"/> 
    <xsl:strip-space elements="*"/> 

    <xsl:template match="DEVICEMESSAGES/HEADERS"> 
    <xsl:value-of select="@id2"/>,<xsl:text/> 
    <xsl:value-of select="@content"/>,<xsl:text/> 
    <xsl:text>&#xa;</xsl:text> 
    </xsl:template> 
</xsl:stylesheet> 

我得到以下輸出:

0001 ,   Nasher[<messageid>]: <!payload> 

而我也需要列標題:

id2,    content 
0001 ,   Nasher[<messageid>]: <!payload> 
+0

您是否重複'DEVICEMESSAGE'元素,重複'HEADER'元素,或者兩者都重複(嘗試確定錨定標題的內容)?另外,您的XML和XSLT不匹配。是「HEADER」還是「HEADERS」? – 2010-04-09 23:58:57

回答

1

如果DEVICEMESSAGES是文檔元素,你都重複MESSAGE元素,那麼這應該工作:

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output method="text"/> 
    <xsl:strip-space elements="*"/> 

    <xsl:template match="DEVICEMESSAGES"> 
     <xsl:text>id2,content,&#xa;</xsl:text> 
     <xsl:apply-templates/> 
    </xsl:template> 

    <xsl:template match="DEVICEMESSAGES/HEADER"> 
    <xsl:value-of select="@id2"/>,<xsl:text/> 
    <xsl:value-of select="@content"/>,<xsl:text/> 
    <xsl:text>&#xa;</xsl:text> 
    </xsl:template> 

</xsl:stylesheet> 

如果你有不同的文檔元素,然後調整模板來匹配上。

例如,如果在文檔元素是doc,你有1至N號DEVICEMESSAGES元素:

<doc> 

<DEVICEMESSAGES> 
    <VERSION xml="1" checksum="" revision="0" envision="33050000" device="" /> 
    <HEADER id1="0001" id2="0001" content="Nasher[&lt;messageid&gt;]: &lt;!payload&gt;" /> 
    <MESSAGE level="7" parse="1" parsedefvalue="1" tableid="15" id1="24682" id2="24682" eventcategory="1003010000" content="Access to &lt;webpage&gt; was blocked due to its category (&lt;info&gt; by &lt;hostname&gt;)" /> 
</DEVICEMESSAGES> 

<DEVICEMESSAGES> 
    <VERSION xml="1" checksum="" revision="0" envision="33050000" device="" /> 
    <HEADER id1="0002" id2="0002" content="Nasher[&lt;messageid&gt;]: &lt;!payload&gt;" /> 
    <MESSAGE level="7" parse="1" parsedefvalue="1" tableid="15" id1="24682" id2="24682" eventcategory="1003010000" content="Access to &lt;webpage&gt; was blocked due to its category (&lt;info&gt; by &lt;hostname&gt;)" /> 
</DEVICEMESSAGES> 

</doc> 

,那麼你可以使用這個:

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output method="text"/> 
    <xsl:strip-space elements="*"/> 

    <xsl:template match="doc"> 
     <xsl:text>id2,content,&#xa;</xsl:text> 
     <xsl:apply-templates/> 
    </xsl:template> 

    <xsl:template match="DEVICEMESSAGES/HEADER"> 
    <xsl:value-of select="@id2"/>,<xsl:text/> 
    <xsl:value-of select="@content"/>,<xsl:text/> 
    <xsl:text>&#xa;</xsl:text> 
    </xsl:template> 

</xsl:stylesheet> 

編輯:另一種使用根節點模板匹配的替代方法,不需要知道文檔元素是什麼:

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output method="text"/> 
    <xsl:strip-space elements="*"/> 

    <xsl:template match="/"> 
     <xsl:text>id2,content,&#xa;</xsl:text> 
     <xsl:apply-templates/> 
    </xsl:template> 

    <xsl:template match="DEVICEMESSAGES/HEADER"> 
    <xsl:value-of select="@id2"/>,<xsl:text/> 
    <xsl:value-of select="@content"/>,<xsl:text/> 
    <xsl:text>&#xa;</xsl:text> 
    </xsl:template> 

</xsl:stylesheet> 
+0

或者也許模板匹配=「*」,並讓該模板顯式調用DEVICEMESSAGE/HEADER上的匹配。 – Nat 2010-04-12 02:27:37

+0

@Nat - 可能是'/ *'限制匹配,以便不匹配除文檔元素之外的文檔中的任何元素。或者只是爲根節點添加模板匹配。很多方法來做到這一點。它有助於查看完整的數據結構示例。 – 2010-04-12 11:00:07

+0

糟糕。更好的方式。 – Nat 2010-04-12 21:13:53