XSLT - добавление тегов в узел text () - PullRequest
0 голосов
/ 23 июня 2009

Я пытаюсь реализовать текстовый фильтр, который добавляет родительский узел к каждому текстовому узлу.

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

Это прекрасно работает до тех пор, пока я не вызову это косвенно:

<xsl:apply-templates/>

Но если я вызываю шаблон напрямую, используя

<xsl:apply-templates select="text()"/>

новый тег исчезает.

Может кто-нибудь объяснить мне, почему?

Приветствия
Jan

Ответы [ 3 ]

1 голос
/ 23 июня 2009

Я был немного смущен своим собственным кодом. Полный пример выглядит так:

<xsl:template match="/">
    <xsl:call-template name="a">
        <xsl:with-param name="b">
            <xsl:apply-templates select="text()"/>
        </xsl:with-param>
    </xsl:call-template>
</xsl:template>

<xsl:template name="a">
    <xsl:param name="b"/>
    <xsl:value-of select="$b"/> <!-- here is my error -->
</xsl:template>

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

Моя ошибка была в том, что я не видел value-of в вызывающем шаблоне. Если я поменяю value-of на apply-templates, все будет нормально.

Спасибо
Jan

0 голосов
/ 24 июня 2009

Я думаю, что проблема в том, что в шаблоне "a" параметр "b" является набором узлов. Для доступа к этому вам, возможно, придется использовать функцию расширения «набор узлов» в XSL. Он не является частью стандартного XSLT, поэтому вам нужно указать расширение.

<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:ext="urn:schemas-microsoft-com:xslt">
    <xsl:template match="/">
        <xsl:call-template name="a">
            <xsl:with-param name="b">
                <xsl:apply-templates select="text()"/>
            </xsl:with-param>
        </xsl:call-template>
    </xsl:template>
    <xsl:template name="a">
        <xsl:param name="b"/>
        <xsl:for-each select="ext:node-set($b)">
            <xsl:copy-of select="."/>
        </xsl:for-each>
    </xsl:template>
    <xsl:template match="text()">
        <aNewTag>
            <xsl:value-of select="."/>
        </aNewTag>
    </xsl:template>
</xsl:stylesheet>

Этот работает только для синтаксического анализатора XML Microsoft (MSXML). Для других процессоров XML, таких как xsltproc, следует использовать пространство имен "http://exslt.org/common".

Это позволяет вам получить доступ к узлу или узлам, которые составляют параметр "b", хотя в моем примере выше я использовал для их итерации.

Вот статья, которая объясняет набор узлов

XML.Com Article

0 голосов
/ 23 июня 2009

Если вы используете элемент xal: apply-templates без атрибута select, значение select неявно устанавливается равным node (), т.е. все дочерние узлы и, следовательно, ваш шаблон text () совпадают.

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