XSLT Явный выбор узла ничего не возвращает - PullRequest
2 голосов
/ 08 декабря 2010

У меня проблемы с получением XSLT, который возвращает только значения категорий из XML.Почему lastupdate и путь возвращаются?... и как я могу это остановить?Заранее спасибо.

XML-документ

<?xml version="1.0"?>
<categories count="3">
    <lastupdate>08/12/2010 12:27</lastupdate>
    <path>C:\</path>
    <category>Music</category>
    <category>News</category>
    <category>Sport</category>
</categories>

My XSLT

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
    <xsl:template match="categories">
        <html>
            <body>
                <table border="0" cellpadding="0" cellspacing="0">
                    <tbody>
                        <tr>
                            <td>
                                <xsl:apply-templates/>
                            </td>
                        </tr>
                    </tbody>
                </table>
            </body>
        </html>
    </xsl:template>

    <xsl:template match="category">
        <a>
            <xsl:value-of select="." />
        </a>
    </xsl:template>
</xsl:stylesheet>

Вывод HTML

<html>
    <body>
        <table border="0" cellpadding="0" cellspacing="0">
            <tbody>
                <tr>
                    <td>08/12/2010 12:27C:\
                        <a>Music</a>
                        <a>News</a>
                        <a>Sport</a>
                    </td>
                </tr>
            </tbody>
        </table>
    </body>
</html>

Ответы [ 4 ]

3 голосов
/ 08 декабря 2010

Почему возвращаются lastupdate и path?

Поскольку встроенные правила , именно эти два:

<xsl:template match="*|/">
  <xsl:apply-templates/>
</xsl:template>

<xsl:template match="text()|@*">
  <xsl:value-of select="."/>
</xsl:template>

Пусто apply-templates - это то же самое, что и select="node()".Затем элементы lastupdate и path сопоставляются по встроенному правилу для элементов (просто применяют шаблоны к дочерним узлам), а их дочерние текстовые узлы сопоставляются по встроенному правилу для текстовых узлов (значение выходной строки).

... и как я могу это остановить?

Перезаписать одно из встроенных правил, например:

<xsl:template match="text()"/>

То есть нет вывода текстового узла,Или используйте подход стиля толчка как

<xsl:template match="categories">
 <html>
  <body>
   <xsl:apply-templates select="category"/>
  </body>
 </html>
</xsl:template>  
1 голос
/ 08 декабря 2010

В вашем коде вы применяете шаблон для всех categories 'узлов дочерних элементов. Смотри http://www.w3.org/TR/xslt#built-in-rule

Таким образом, вам нужен следующий код:

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
    <xsl:output method="html" indent="yes" omit-xml-declaration="yes"/>
    <xsl:template match="categories">
        <html>
            <body>
                <xsl:apply-templates select="category"/>
            </body>
        </html>
    </xsl:template>

    <xsl:template match="category">
        <a>
            <xsl:value-of select="." />
        </a>
    </xsl:template>
</xsl:stylesheet>

Чтобы получить желаемый результат:

<html>
    <body>
        <a>Music</a>
        <a>News</a>
        <a>Sport</a>
    </body>
</html>
1 голос
/ 08 декабря 2010

Ваш применяет все соответствующие шаблоны ко всем подузлам.

Поскольку вы не определили соответствующие шаблоны для lastupdate и path, XSLT применяет шаблоны по умолчанию, которые в этом случае копируют текстовое содержимое.

Если вы хотите отключить это, вы должны либо переопределить шаблон (ы) по умолчанию (как правило, не так хорошо), либо ограничить применение шаблона на узлах, которые вы хотите обработать. В вашем примере разверните apply-templates до

<xsl:apply-templates select="./category"/>
0 голосов
/ 08 декабря 2010

Может быть, что-то вроде этого где-то внизу вашего xslt:

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

Это объясняет, почему вы получаете эти значения где-то в середине вашего вывода.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...