от сложной xml до «плоской» структуры - PullRequest
1 голос
/ 19 сентября 2011

Пожалуйста, я пытаюсь извлечь "простой текст" из "аннотированного текста" (или простой контент из сложного содержимого).

Это входной XML-код, который у меня есть:

<l>string</l>
<l>string<g><b/>string2</g></l>
<l>string<g><b/>string2</b>string3</g></l>
<l>string<b/>string2<b/>string3</l>

и вот что мне нужно:

<word>string</word>
<word>string1 string2</word>
<word>string1 string2 string3</word>
<word>string1 string2 string3</word>

По существу: (i) мне не нужен элемент и (ii) заменить пустые элементы пробелами

Большое спасибо!

1 Ответ

2 голосов
/ 19 сентября 2011

Этого можно достичь, используя преобразование идентичности, но переопределяя его в ваших особых случаях, например:

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

   <!-- Replace elements under root element with word element -->
   <xsl:template match="/*/*">
      <word>
         <xsl:apply-templates select="node()"/>
      </word>
   </xsl:template>

   <!-- Match, but don't copy, elements -->
   <xsl:template match="@*|node()">
      <xsl:apply-templates select="@*|node()"/>
   </xsl:template>

   <!-- Copy out text nodes -->
   <xsl:template match="text()">
      <xsl:copy/>
   </xsl:template>

   <!-- Replace empty element by space -->
   <xsl:template match="*[not(node())]">
      <xsl:text>&#160;</xsl:text>
   </xsl:template>

</xsl:stylesheet>

При применении к следующему XML

<data>
   <l>string</l>
   <l>string<g><b/>string2</g></l>
   <l>string<g><b/>string2<b/>string3</g></l>
   <l>string<b/>string2<b/>string3</l>
</data>

Вывод выглядит следующим образом:

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