XSL выводит больше, чем ожидалось - PullRequest
1 голос
/ 15 ноября 2011

Я довольно новичок в XSLT и XPath и уже некоторое время бьюсь головой об стену по этой проблеме.

У меня есть следующий XML:

<reply>
    <multi-results>
        <multi-item>
            <name>node1</name>
            <information>
                <block>
                    <slot>A</slot>
                    <state>Online</state>
                    <colour>purple</colour>
                </block>
                <block>
                    <slot>B</slot>
                    <state>Online</state>
                    <colour>yellow</colour>
                </block>
                <block>
                    <slot>C</slot>
                    <state>Online</state>
                    <colour>red</colour>
                </block>
                <block>
                    <slot>D</slot>
                    <state>Online</state>
                    <colour>blue</colour>
                </block>
            </information>
        </multi-item>
    </multi-results>
    <address>
        <label>this is an arbitrary bit of text included for this example</label>
    </address>
</reply>

Тампеременное количество записей «блока» на файл.

Я хочу «CSV» данных, и я использую следующий XSL:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="text"/>
    <xsl:template match="*/text()[normalize-space()]">
        <xsl:value-of select="normalize-space()"/>
    </xsl:template>
    <xsl:template match="*/text()[not(normalize-space())]" />
    <xsl:template match="block">
        <xsl:value-of select="slot"/>
        <xsl:text>|</xsl:text>
        <xsl:value-of select="state"/>
        <xsl:text>|</xsl:text>
        <xsl:value-of select="colour"/>
        <xsl:text>&#10;</xsl:text>
    </xsl:template>
</xsl:stylesheet>

Вывод:

node1A|Online|purple
B|Online|yellow
C|Online|red
D|Online|blue
this is an arbitrary bit of text included for this example

Однако выходные данные включают в себя как "имя", так и "метку" ...

Я хочу только то, что я явно запрашиваю в XSL:

A|Online|purple
B|Online|yellow
C|Online|red
D|Online|blue

Я не понимаю, почему.Может кто-нибудь объяснить, пожалуйста?

Также может быть несколько элементов "name", каждый со своим собственным количеством элементов "block".

Заранее большое спасибо

Ответы [ 2 ]

3 голосов
/ 15 ноября 2011

Элементы вне <block> обрабатываются с использованием правил шаблона по умолчанию. Для предотвращения этого вам нужно добавить

<xsl:template match="/">
  <xsl:apply-templates select="block"/>
</xsl:template>

Тогда вам не нужны правила шаблонов, которые соответствуют текстовым узлам, потому что вы никогда не применяете шаблоны к текстовым узлам.

2 голосов
/ 15 ноября 2011

Просто удалите xsl: value-of из вашего первого xsl: шаблона. Из-за этого вы получаете содержимое «name» и «label»: оно берет любой текстовый узел и выводит его содержимое. Более того, вам не нужно проверять условия на текстовых узлах, оставьте для них один шаблон xsl: с пустым телом:

 <xsl:template match="*/text()"/>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...