встраивание тегов в xslt

У меня есть этот xslt, который работает:

<xsl:when test="area_of_expertise">

    <div>
        <xsl:value-of select="area_of_expertise"/>
    </div>
</xsl:when>

но то, что мне нужно, это строки:

<xsl:when test="area_of_expertise">

    <div id="<xsl:value-of select="area_of_expertise"/>">
        <xsl:value-of select="area_of_expertise"/>
    </div>
</xsl:when>

Однако во втором примере есть ошибки. Кто-нибудь знает, почему?

Кстати, есть ли способ преобразовать имя узла area_of_expertise в areaOfExperiseLabel и вставить его в качестве идентификатора? вывод, который мне действительно нужен, таков:

<div id="areaOfExpertiseLabel">
    asasdasdasd
</div>

person Pacerier    schedule 08.06.2011    source источник


Ответы (5)


Для второй части попробуйте использовать этот шаблон:

<xsl:template name="parse">
        <xsl:param name="input"/>
        <xsl:param name="position"/>


        <xsl:if test="$position &lt;= string-length($input)">

            <xsl:choose>
                <xsl:when test="substring($input, $position, 1) = '_'">
                    <xsl:value-of select="translate(substring($input, $position + 1, 1), 'abcdefghijklmnopqrstuvwxyz', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')"/>

                    <xsl:call-template name="parse">
                        <xsl:with-param name="input" select="$input"/>
                        <xsl:with-param name="position" select="$position + 2"/>
                    </xsl:call-template>
                </xsl:when>

                <xsl:otherwise>

                    <xsl:value-of select="substring($input, $position, 1)"/>

                    <xsl:call-template name="parse">
                        <xsl:with-param name="input" select="$input"/>
                        <xsl:with-param name="position" select="$position + 1"/>
                    </xsl:call-template>
                </xsl:otherwise>
            </xsl:choose>

        </xsl:if>


    </xsl:template>

Использование:

<xsl:call-template name="parse">
            <xsl:with-param name="input" select="'area_of_expertise'"/>
            <xsl:with-param name="position" select="1"/>
        </xsl:call-template>
person Kirill Polishchuk    schedule 08.06.2011
comment
Ради бога, пожалуйста, используйте библиотеку вместо того, чтобы заниматься подобным ручным анализом. См. ответ DCharness. - person Jordan; 08.06.2011
comment
@Jordan, эй, я не смог заставить ответ dcharness работать: stackoverflow.com/questions/6289509/ вы можете помочь мне с этим, спасибо - person Pacerier; 09.06.2011
comment
@Pacerier, тебе действительно стоило задать еще один вопрос. Вы приняли ответ, который не имеет ничего общего с первоначальным вопросом, который вы задали. - person Jordan; 09.06.2011
comment
@Pacerier, да, я это понимаю, но вы отредактировали свой исходный вопрос, включив в него эту вторую часть, и, как правило, это должен быть отдельный вопрос, а не добавление чего-либо, иначе ответы станут довольно запутанными. - person Jordan; 09.06.2011

Причина, по которой он выдает ошибку, заключается в том, что он больше не является допустимым XML.

Чтобы сделать то, что вы пытаетесь сделать:

<xsl:when test="title">

    <div id="{title}">
        <xsl:value-of select="title"/>
    </div>
</xsl:when>

Вы можете поместить любой селектор внутри тегов {} или даже ссылаться на переменные, если у вас есть что-то сложное.

<xsl:variable name="some_complex_variable">
    <xsl:value-of select="title"/>
</xsl:variable>

<xsl:when test="title">

    <div id="{$some_complex_variable}">
        <xsl:value-of select="title"/>
    </div>
</xsl:when>

Третий, многословный способ сделать это — динамически прикрепить атрибут с помощью xsl:attribute:

<xsl:when test="title">

    <div>
        <xsl:attribute name="id" select="title"/>
    </div>
</xsl:when>
person Jordan    schedule 08.06.2011
comment
Привет, спасибо за помощь .. Кстати, я обновил вопрос, не могли бы вы помочь мне со второй частью? - person Pacerier; 08.06.2011
comment
name().) или local-name(.) должны дать вам имя узла в любом месте, где вы хотите. ‹div id={name(.)› будет работать, например, если вы находитесь в цикле. . это просто селектор. Вы можете заменить это любым XPath. - person Jordan; 08.06.2011

Во второй части, о преобразовании символов подчеркивания в верблюжий, вы можете посмотреть обработку строк в стандартной библиотеке XSLT. . С str:subst() для разделения на символы подчеркивания, str:to-camelcase() для соответствующего изменения регистра букв и concat() для добавления суффикса «Метка», вы должны быть настроены.

person DCharness    schedule 08.06.2011
comment
эй не могли бы вы помочь мне с этим. на этой странице пишет str:substr() disable-output-escaping: A value of yes indicates that the result should have output escaping disabled. Any other value allows normal escaping of text values. The default is to enable output escaping. но я все равно не понимаю, что там написано.. - person Pacerier; 09.06.2011
comment
Обычно вывод XSLT экранирует символы, специальные для XML, & и ‹ (и, возможно, другие символы) в выводе текстового узла. Этот параметр позволяет избежать этого, если, например, вы создаете выходные данные, отличные от XML, из входных данных XML. Поскольку вы ищете вывод в формате XML, вы можете оставить значение по умолчанию «нет». См. w3.org/TR/xslt#disable-output-escaping. - person DCharness; 12.06.2011

Для первой части вы можете использовать:

<xsl:when test="area_of_expertise">
    <div>
        <xsl:attribute name="id">
            <xsl:value-of select="area_of_expertise"/>
        </xsl:attribute>

        <xsl:value-of select="area_of_expertise"/>
    </div>
</xsl:when>
person Kirill Polishchuk    schedule 08.06.2011

Это может быть глупый ответ, но кажется, что вам нужна эта простая трассировка:

<xsl:when test="area_of_expertise">
    <div id="areaOfExperiseLabel">
        <xsl:value-of select="area_of_expertise"/>
    </div>
</xsl:when>

Иначе зачем вам <xsl:value-of select="area_of_expertise"/> вместо @id, если вам нужна другая строка?

person Emiliano Poggi    schedule 08.06.2011
comment
я не хочу набирать areaOfExperiseLabel сам, я хочу, чтобы компьютер мог вывести это из area_of_expertise - person Pacerier; 08.06.2011
comment
Тем не менее, ваш запрос. имеет смысл, если вы не знаете имя элемента априори. Тогда это ваш случай? И в таком случае, как вы можете соответствовать этому? - person Emiliano Poggi; 08.06.2011
comment
ну, мне нужна функция, чтобы сделать это, потому что area_of_expertise - не единственная строка, которая нуждается в таком преобразовании, есть еще 10 других, которые требуют этого преобразования верблюда. - person Pacerier; 09.06.2011
comment
хорошо, а что плохого в других ответах? а вы ищете XSLT 1.0 или 2.0? - person Emiliano Poggi; 09.06.2011
comment
@empo я не могу заставить ответ dcharness работать: stackoverflow.com/questions/6289509/ - person Pacerier; 09.06.2011
comment
@emp я бы хотел решение 2.0 - person Pacerier; 09.06.2011
comment
Вы уже приняли ответ. Итак, предполагается, что вы согласны с этим. - person Emiliano Poggi; 09.06.2011
comment
да, это работает .. несмотря на то, что это уродливое решение, поэтому, конечно, если есть лучший способ, я буду искать его тогда .. - person Pacerier; 09.06.2011