XSLT 2.0: переопределение узлов с узлами внука - PullRequest
1 голос
/ 28 февраля 2012

Я пытаюсь найти способ заменить узел с тем же именем в глубине дерева.Например, со следующим вводом:

<root>
    <foo>
        <a>1</a>
        <b>2</b>
        <c>3</c>
        <bar>
            <a>100</a>
            <c>5000</c>
        </bar>
    </foo>
</root>

Я хотел бы создать что-то вроде этого:

<root>
    <foo>
        <a>100</a>
        <b>2</b>
        <c>5000</c>
    </foo>
</root>

Мне нужно иметь возможность заменить любое количество узлов, и яТакже хотелось бы составить список динамически, а не излагать все возможности, потому что есть вероятность, что все изменится в будущем.Еще одно требование заключается в том, что порядок родительских узлов должен оставаться неизменным.(Если быть точным, мой окончательный вывод будет CSV-файлом, поэтому столбцы должны быть выровнены с заголовками.)

Это моя первая попытка изучения XSLT, и я совершенно туп на этом!Любая помощь будет принята с благодарностью.Я использую XSLT 2.0, кстати.

Спасибо, Марк

1 Ответ

0 голосов
/ 28 февраля 2012

Я прошу прощения за неприятную ошибку SO, которая не делает отступ отформатированному коду!

Они не могут это исправить месяцами ...

Это преобразование :

<xsl:stylesheet version="2.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
 xmlns:xs="http://www.w3.org/2001/XMLSchema">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>
 <xsl:strip-space elements="*"/>

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

 <xsl:template match=
 "*[*]
       [every $leaf in .//*[not(*)]
      satisfies
        name($leaf) = preceding::*/name()
       ]
 "/>

 <xsl:template match=
  "*[not(*) and name() = following::*/name()]">

  <xsl:sequence select=
  "following::*[name() = name(current())][1]"/>
 </xsl:template>
</xsl:stylesheet>

при применении к предоставленному документу XML :

<root>
    <foo>
        <a>1</a>
        <b>2</b>
        <c>3</c>
        <bar>
            <a>100</a>
            <c>5000</c>
        </bar>
    </foo>
</root>

дает желаемый, правильный результат :

<root>
   <foo>
      <a>100</a>
      <b>2</b>
      <c>5000</c>
   </foo>
</root>
...