获取属性作为列标题

时间:2010-04-09 16:32:31

标签: xslt

我有以下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>

1 个答案:

答案 0 :(得分: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>