преобразовать все элементы xml в txt с помощью xslt - PullRequest
1 голос
/ 22 декабря 2011

Я хочу перебрать все узлы и подузлы (рекурсивно) в xml и преобразовать элементы в формат txt.Например:

<root>
  <level>
    <data1>data1</data1>
    <sublevel>
       <data2>data2</data2>
    </sublevel>
  </level>
</root>

я хочу следующий вывод в формате txt:

root
  level
    data1:data1
    sublevel
      data2:data2

мое текущее преобразование xslt:

<xsl:strip-space elements="*" />

<xsl:template match="/">
  <xsl:for-each select="*">
    <xsl:value-of select="local-name()"/>: <xsl:value-of select="."/><xsl:text>&#xa;</xsl:text>
  </xsl:for-each>
</xsl:template>

, но оно не дает желаемого вывода,Есть некоторые ошибки:

  • имя элемента преобразуется только для корневого узла
  • есть пустые строки, если есть пустые элементы (я хочу подавить пустые строки)

спасибо

Ответы [ 3 ]

0 голосов
/ 22 декабря 2011

Использование:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="xml" indent="yes" omit-xml-declaration="yes"/>

    <xsl:template match="*">
        <xsl:value-of select="local-name()"/>

        <xsl:apply-templates/>
    </xsl:template>

    <xsl:template match="text()[normalize-space(.)]">
        <xsl:value-of select="concat(':', .)"/>
    </xsl:template>
</xsl:stylesheet>

Выход MSXSL:

root
    level
        data1:data1
        sublevel
            data2:data2
0 голосов
/ 22 декабря 2011

Ниже может быть хороший толчок в правильном направлении: для вывода нужны отступы и подэлементы, а не вывод, но я думаю, вы сможете это выяснить: -).

<xsl:template match="/root">
    <xsl:call-template name="nodeToText"/>
</xsl:template>

<xsl:template name="nodeToText">
    <xsl:value-of select="local-name()"/>: <xsl:value-of select="."/><xsl:text>&#xa;</xsl:text>
    <xsl:for-each select="child::*">
        <xsl:call-template name="nodeToText"/>
    </xsl:for-each>
</xsl:template>

Что приводит к следующему выводу:

root: data1data2
level: data1data2
data1: data1
sublevel: data2
data2: data2
0 голосов
/ 22 декабря 2011

Попробуйте заменить:

xsl:value-of select="local-name()"

на

xsl:value-of select="text()"

Вы можете проверить пустые значения на if:

<if test="text() = '' >

У меня нетпротестировал код, но должен дать вам представление.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...