Реструктуризация узлов XML с использованием XSLT - PullRequest
2 голосов
/ 07 июня 2010

Хотите использовать XSLT для преобразования моего XML. Пример XML выглядит следующим образом:

<root>
<info>
    <firstname>Bob</firstname>
    <lastname>Joe</lastname>
</info>
<notes>
    <note>text1</note>
    <note>text2</note>
</notes>
<othernotes>
    <note>text3</note>
    <note>text4</note>
</othernotes>

Я хочу извлечь все элементы "note" и разместить их под родительским узлом "notes".

Результат, который я ищу, выглядит следующим образом:

<root>
<info>
    <firstname>Bob</firstname>
    <lastname>Joe</lastname>
</info>
<notes>
    <note>text1</note>
    <note>text2</note>
    <note>text3</note>
    <note>text4</note>
</notes>
</root>

XSLT, который я пытался использовать, позволяет мне извлечь все мои «заметки», однако я не могу понять, как можно обернуть их обратно в узел «заметок».

Вот XSLT, который я использую:

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

    <xsl:template match="notes|othernotes">
        <xsl:apply-templates select="note"/>
    </xsl:template>
    <xsl:template match="*">
    <xsl:copy><xsl:apply-templates/></xsl:copy>
    </xsl:template>

</xsl:stylesheet>

Результат, который я получаю с помощью XSLT:

<root>
<info>
    <firstname>Bob</firstname>
    <lastname>Joe</lastname>
</info>
    <note>text1</note>
    <note>text2</note>
    <note>text3</note>
    <note>text4</note>
</root>

Спасибо

Ответы [ 2 ]

2 голосов
/ 07 июня 2010

Вы можете создавать такие элементы, как это:

<xsl:element name="notes">
   <!-- inject content of notes element here using e.g. <xsl:copy> or <xsl:copy-of> -->
</xsl:element>

С небольшой модификацией вышеупомянутый подход работает также для генерации элементов в определенном пространстве имен XML. Однако, так как вы не хотите создавать элементы в пространствах имен, существует ярлык:

<notes>
  <!-- inject content of notes element here using e.g. <xsl:copy> or <xsl:copy-of> -->
</notes>

В вашем конкретном примере я бы реструктурировал вашу таблицу стилей, сделав следующее:

<xsl:template match="root">
   <root>
     <xsl:copy-of select="info"/>
     <notes>
        <xsl:copy-of select="*/note"/>
     </notes>
   </root>
</xsl:template>
1 голос
/ 07 июня 2010

Вы будете искать что-то вроде этого: -

<xsl:template match="@*|node()">
   <xsl:copy>
      <xsl:apply-templates select="@*|node()"/>
   </xsl:copy>
</xsl:template>

<xsl:template match="/root">
  <xsl:copy>
     <xsl:apply-templates select="@*|node()[local-name() != 'notes' and local-name() != 'othernotes']
  </xsl:copy>
  <notes>
     <xsl:apply-templates select="othernotes/note | notes/note" />
  </notes>
</xsl:template>

Вы берете под контроль структуру корневого узла. Сначала скопируйте все под корневым каталогом, который не называется «заметки» или «другие заметки». Затем непосредственно создайте элемент «notes», затем объедините все элементы «note», которые находятся под элементом «othernotes» или «notes».

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