Изменение XML с вложением переменных - PullRequest
0 голосов
/ 30 апреля 2019

У меня есть XML-документ, который состоит из темы верхнего уровня, за которой следует необязательная подтема, за которой следует таблица.Я хочу реорганизовать все это в таблицу, в которой тема и подтема представляют собой столбцы

Источник 1

<topic>
    <title>Some Category</title>
    <topic>
        <title>Some Subcategory</title>
        <table>
            <tr><td>Value 1</td><td>Value 2</td><td>Value 3</td></tr>
            ...
        </table>
    </topic>
    ...
</topic>
...

Источник 2

<topic>
    <title>Some Category</title>
    <table>
        <tr><td>Value 1</td><td>Value 2</td><td>Value 3</td></tr>
        ...
    </table>
</topic>

Цель 1

<table>
    <tr><td>Some Category</td><td>Some Subcategory</td><td>Value 1</td><td>Value 2</td><td>Value 3</td></tr>
    ...
</table>

Цель 2

<table>
    <tr><td>Some Category</td><td>Value 1</td><td>Value 2</td><td>Value 3</td></tr>
    ...
</table>

Я только начал изучать XMLStarlet, который, похоже, подходит для этой работы, но я не понял, какиметь дело с этим необязательным подтемным слоем.

1 Ответ

0 голосов
/ 09 мая 2019

Отвечая на мой вопрос.

Я понял, как написать bash-скрипт, который бы делал это, но XSLT-преобразование кажется более надежным и быстрым. Я не проверял это всесторонне, но это, кажется, работает. Я новичок в XSLT, поэтому возьмите это с несколькими зернами соли.

Источник

<topic>
    <title>Some Category</title>
    <topic>
        <title>Some Subcategory</title>
        <table>
            <tr><td>Value 1</td><td>Value 2</td><td>Value 3</td></tr>
            ...
        </table>
    </topic>
    ...
</topic>
<topic>
    <title>Some Category</title>
    <table>
        <tr><td>Value 1</td><td>Value 2</td><td>Value 3</td></tr>
        ...
    </table>
</topic>

1008 * XSLT * <?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:template match="/"> <html> <head> <title>Test doc</title> </head> <body> <xsl:if test="topic/topic"> <xsl:for-each select="topic"> <xsl:variable name="topic_title" select="title/text()" /> <xsl:for-each select="topic"> <xsl:variable name="subtopic_title" select="title/text()" /> <xsl:copy-of select="$topic_title" /> <xsl:copy-of select="$subtopic_title" /> <xsl:for-each select="//tr"> <tr><td><xsl:copy-of select="$topic_title" /></td><td><xsl:copy-of select="$subtopic_title" /></td><xsl:copy-of select="*" /> </tr> </xsl:for-each> </table> </xsl:for-each> </xsl:for-each> </xsl:if> <xsl:if test="not(topic/topic)"> <xsl:for-each select="topic"> <xsl:variable name="topic_title" select="title/text()" /> <xsl:copy-of select="$topic_title" /> <xsl:for-each select="//tr"> <tr><td><xsl:copy-of select="$topic_title" /></td><xsl:copy-of select="*" /></tr> </xsl:for-each> </table> </xsl:for-each> </xsl:if> </body></html> </xsl:template> </xsl:stylesheet>

...