получение атрибута в качестве заголовков столбцов - PullRequest
1 голос
/ 09 апреля 2010

У меня есть следующий 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 Ответ

1 голос
/ 10 апреля 2010

Если 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, а количество элементов DEVICEMESSAGES составляет от 1 до N:

<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>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...