Условный тег when-test базового XSLT - PullRequest
0 голосов
/ 11 марта 2012

Я пытался проверить мой XSLT на примере XML-файла. Однако вывод будет содержать только пустой тег.

Я полагаю, что это не удается на <when test="self::text()"> Я думал, что если бы это был текст, он напечатал бы значение.

Пожалуйста, скажите, пожалуйста, что пошло не так.


XML-файл:

<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="xslt2.xslt"?>

<library>
 <book><page>30</page></book>
 <book>fun</book>
</library>

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="/">
    <result>
        <xsl:call-template name="t">
            <xsl:with-param name="b" select="."></xsl:with-param>       
        </xsl:call-template>
    </result>
    </xsl:template>

    <xsl:template name="t">
        <xsl:param name="b"/>
        <xsl:for-each select="$b/*|$b/text()">
            <xsl:choose>
                <xsl:when test="self::text()">
                    <xsl:value-of select="." disable-output-escaping="no"></xsl:value-of>
                </xsl:when>
            </xsl:choose>
        </xsl:for-each>
    </xsl:template>
</xsl:stylesheet>

Ответы [ 2 ]

1 голос
/ 11 марта 2012

Ваш шаблон вызывается на корневом узле. / Пробел до и после элемента документа игнорируется и не добавляет текстовый узел, поэтому у корневого узла просто есть два дочерних элемента, библиотека узла элемента и инструкция процесса таблицы стилей. так

$b/*

выбирает библиотеку элементов и

$b/text()

ничего не выбирает

и xsl:for-each просто выполняет одну итерацию, которая затем возвращает false для теста self::text()"

0 голосов
/ 11 марта 2012

Зацикливание в XSLT лучше всего делать неявно, применяя шаблоны.Кажется, что на ваше мышление слишком сильно влияют процедурные языки программирования.
Например, приведенный ниже цикл проходит по всем подузлам и извлекает текстовые значения.

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

    <xsl:output method="xml" indent="yes"/>

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

    <xsl:template match="*|text()">
        <xsl:choose>
            <xsl:when test="text()">
                <xsl:value-of select="." disable-output-escaping="no"/>
            </xsl:when>
       </xsl:choose>
        <xsl:apply-templates/>
   </xsl:template>
</xsl:stylesheet>

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

<?xml version="1.0" encoding="UTF-8"?>
<result>30fun</result>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...