У меня есть XML-файл, в котором элементы B находятся внутри элементов A, и я хочу переместить их вверх. От:
<?xml version="1.0" encoding="utf-8"?>
<root>
<A>
<C>Text</C>
Text again
More text
<D>Other text</D>
<B>Text again</B>
<C>No</C>
<D>May be</D>
<B>What?</B>
</A>
<A>
Something
<B>Nothing</B>
<D>Again</D>
<B>Content</B>
End
</A>
</root>
Я хотел бы иметь:
<?xml version="1.0" encoding="utf-8"?>
<root>
<A>
<C>Text</C>
Text again
More text
<D>Other text</D>
</A>
<B>Text again</B>
<A>
<C>No</C>
<D>May be</D>
</A>
<B>What?</B>
<A>
Something
</A>
<B>Nothing</B>
<A>
<D>Again</D>
</A>
<B>Content</B>
<A>
End
</A>
</root>
Ближайшая программа XSLT, которую я имею, это:
<xsl:stylesheet
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
exclude-result-prefixes="xs" version="1.0">
<xsl:output method="xml" indent="yes"/>
<xsl:template match="@* | node()">
<xsl:copy>
<xsl:apply-templates select="@* | node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="A">
<xsl:for-each select="*">
<xsl:choose>
<xsl:when test="name()='B'">
<xsl:apply-templates select="."/>
</xsl:when>
<xsl:otherwise>
<xsl:element name="A">
<xsl:apply-templates select="."/>
</xsl:element>
</xsl:otherwise>
</xsl:choose>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
У него две проблемы: он игнорирует текстовые узлы (возможно, это просто вопрос добавления | text () к select = "*"), но, что более важно, он создает элемент для каждого узла, в то время как я хотел бы их оставаться вместе под одним. Например, приведенная выше таблица стилей составляет:
<A><C>No</C></A>
<A><D>May be</D></A>
где я хочу:
<A><C>No</C>
<D>May be</D></A>
В моих файлах XML всегда есть прямые потомки, а вложения нет или нет.
Основным вариантом использования является создание HTML, где UL и OL не могут быть внутри P.
Этот вопрос связан, но не идентичен xslt, сглаживающему дочерние элементы в элементе DocBook (и может также относиться к Свести иерархию xml с использованием XSLT
)