2010-04-09 2 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> 

тогда I также нужны заголовки столбцов:

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

У вас есть повторяющиеся элементы «DEVICEMESSAGE», повторяющие элементы «HEADER» или повторяющиеся (пытается определить, к чему привязать заголовок)? Кроме того, ваши XML и XSLT не совпадают. Является ли 'HEADER' или' HEADERS'? –

ответ

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> 

EDIT: Другая альтернатива, использующая совпадение шаблона корневого узла и не нуждается в том, что элемент документа:

<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

Или, возможно, шаблон match = "*", и этот шаблон явно вызывает совпадение на DEVICEMESSAGE/HEADER. – Nat

+0

@Nat - Возможно, '/ *' ограничивать совпадение, чтобы не совпадать ни с одним элементом в документе, кроме элемента документа. Или просто добавьте соответствие шаблона для корневого узла. Много способов сделать это. Это помогает увидеть полный образец структуры данных. –

+0

Упс. Лучше так. – Nat

Смежные вопросы