Извлечь часть таблицы XML с использованием XSL - PullRequest
0 голосов
/ 13 июня 2018

Во-первых, мой вопрос очень похож на этот , но с некоторыми вариациями, и мой текущий результат противоположен тому, что я вижу в этом связанном вопросе.Вот подробности моей проблемы:

Цель состоит в том, чтобы удалить все теги table вокруг таблиц, которые содержат изображения и никакой другой контент.Я не могу иметь эти изображения внутри таблицы.

Вот входной XML, который я пытаюсь преобразовать:

    <table  frame="all">
        <tgroup cols="1">
            <colspec colname="col1" colwidth="480pt"/>
            <thead>
                <row>
                    <entry valign="middle">
                        <p>
                            <image href="Images/image33.png" width="770.0" height="122.0">
                                <alt>../../topics/media/image33.wmf</alt>
                            </image><i >italic image title</i>
                        </p>
                    </entry>
                </row>
            </thead>
            <tbody>
                <row>
                    <entry/>
                </row>
            </tbody>
        </tgroup>
    </table>

Вот вывод, который я ищу:

<fig>
    <title>image title</title>
    <image href="Images/image33.png" width="770.0" height="122.0"></image>
</fig>

Я могу добавить <fig> теги с помощью этого шаблона:

<xsl:template match="table//image">
    <xsl:element name="fig">
        <xsl:element name="image">
            <xsl:apply-templates select="*|@*"/>
        </xsl:element>
    </xsl:element>
</xsl:template>

но когда я добавляю этот шаблон (ответ на связанный вопрос выше):

<xsl:template match="table//image">
    <xsl:copy-of select="/tgroup/thead/row/entry/node()" />
</xsl:template>

Я получаю этот вывод:

<table frame="all" class="- topic/table ">
                <tgroup id="topic_61_tg_2" cols="1" class="- topic/tgroup ">
                    <colspec colname="col1" colwidth="480pt" class="- topic/colspec "/>
                    <thead class="- topic/thead ">
                        <row class="- topic/row ">
                            <entry valign="middle" class="- topic/entry ">
                                <i>italic text title</i>
                            </entry>
                        </row>
                    </thead>
                    <tbody class="- topic/tbody ">
                        <row class="- topic/row ">
                            <entry class="- topic/entry "/>
                        </row>
                    </tbody>
                </tgroup>
            </table>

Как видите, таблица, а не изображение сохранилась.Есть идеи, что я здесь делаю не так?Я также хотел бы отметить, что в этом XML-файле есть много другого контента, который я тоже хочу сохранить, поэтому я попытался <xsl:template match="table//image"> для этого copy-of part

Ответы [ 3 ]

0 голосов
/ 13 июня 2018

Вы должны использовать

<xsl:template match="table"><!-- Match table instead of matching image -->
    <xsl:copy-of select="tgroup/thead/row/entry//image" /><!-- than copy image through its XPath -->
</xsl:template>

В вашем примере вы соответствуете шаблону для image и упоминается xpath для table.поэтому это не сработало.

0 голосов
/ 13 июня 2018

Вы можете попробовать это:

<xsl:output indent="yes"/>
<xsl:template match="table">
    <xsl:for-each select="descendant::image">
        <xsl:element name="fig">
            <xsl:element name="title">
                <xsl:value-of select="following-sibling::i"/>
            </xsl:element>
            <xsl:copy-of select="."/>
        </xsl:element>
    </xsl:for-each>
</xsl:template>
0 голосов
/ 13 июня 2018
<xsl:template match="table">
        <xsl:for-each select="//image">
            <xsl:element name="fig">
                <xsl:element name="title">
                    <xsl:value-of select="following-sibling::i"/>
                </xsl:element>
                <xsl:element name="image">
                    <xsl:attribute name="href">
                        <xsl:value-of select="@href"/>
                    </xsl:attribute>
                    <xsl:attribute name="width">
                        <xsl:value-of select="@width"/>
                    </xsl:attribute>
                    <xsl:attribute name="height">
                        <xsl:value-of select="@height"/>
                    </xsl:attribute>
                </xsl:element>
            </xsl:element>
        </xsl:for-each>
    </xsl:template>
    <xsl:template match="image">

    </xsl:template>
    Try it
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...