Почему апостроф выдает ошибку в тестовом атрибуте xsl: когда - PullRequest
4 голосов
/ 21 октября 2011

У меня есть сценарий, в котором я должен проверить, равен ли уровень образования сущности «степени бакалавра / бакалавриату», но компилятор выдает мне сообщение об ошибке «Ожидается конец выражения, найдено« s »».

Вот мой фактический код:

        <xsl:when test="education_level='Bachelor's Degree/Undergraduate Degree'">
          <opleiding>
            <xsl:attribute name="id">
              <xsl:value-of disable-output-escaping="yes" select="'30001'"/>
            </xsl:attribute>
            <xsl:value-of disable-output-escaping="yes" select="'Specialisation'"/>
          </opleiding>
        </xsl:when>

Ребята, помощь будет оценена :) заранее спасибо

Ответы [ 5 ]

4 голосов
/ 21 октября 2011

Вы можете использовать переменную:

<xsl:variable name="s">Bachelor's Degree/Undergraduate Degree</xsl:variable>

и затем:

<xsl:when test="education_level = $s">
2 голосов
/ 21 октября 2011

Можно указать выражение XPath в атрибуте test, не прибегая вообще к дополнительной переменной и ее дочернему элементу текстового узла :

    <xsl:when test="education_level=&quot;Bachelor&apos;s Degree/Undergraduate Degree&quot;">

Вотполное преобразование:

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>
 <xsl:strip-space elements="*"/>

 <xsl:template match="/*">
     <xsl:choose>
        <xsl:when test="education_level=&quot;Bachelor&apos;s Degree/Undergraduate Degree&quot;">
            <opleiding>
                <xsl:attribute name="id">
                    <xsl:value-of select="'30001'"/>
                </xsl:attribute>
                <xsl:value-of select="'Specialisation'"/>
            </opleiding>
        </xsl:when>
     </xsl:choose>
 </xsl:template>
</xsl:stylesheet>

когда это преобразование применяется к следующему документу XML :

<t>
 <education_level>Bachelor's Degree/Undergraduate Degree</education_level>
</t>

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

<opleiding id="30001">Specialisation</opleiding>

Дополнительное примечание : Вы не нуждаетесь в DOE, и в этом конкретном случае это будет либо проигнорировано, либо выдаст ошибку - это потому, чтоDOE допускается только для инструкций, которые создают текстовый узел, а не атрибут.

1 голос
/ 21 октября 2011

Вам нужны разные стратегии, в зависимости от того, является ли кавычка / апостроф, который вы хотите экранировать, разделителем атрибутов XML (внешние кавычки) или разделителем строки XPath (внутренние кавычки).

Для разделителей атрибутов XML используйте предопределенные сущности XML &quot; и &apos;.

Для разделителей строк XPath в XPath 2.0 вы можете избежать их, удваивая (как в SQL), например select="'I won''t'". В XPath 1.0 нет способа избежать строковых разделителей, поэтому вам нужен обходной путь, такой как использование переменных, или конкатенация, или переключение использования двойных и одинарных кавычек. На практике я обычно использую переменные, как вам было показано.

0 голосов
/ 21 октября 2011

Вот тэг, который у вас есть в вашем вопросе:

test="education_level='Bachelor's Degree/Undergraduate Degree'"

Я первым скажу, что ничего не знаю о файлах xslt.Таблицы стилей XML?Я не уверен.Независимо от цели, любой синтаксический анализатор будет иметь ту же проблему в том, что вы вложили пару имя / значение в качестве значения пары имя / значение и это вызывает у вас проблемы.Внутренняя одинарная кавычка (в бакалавриате) не анализируется как буквальная кавычка в строке, она анализируется как конец значения, т. Е. Синтаксический анализатор анализирует вещи как test, являющееся первым именем, и его значениеэто пара имя / значение education_level='Bachelor', за которой следуют некоторые вещи, с которыми она не знает, что делать: s Degree/Undergraduate Degree '.

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

<xsl:when test="education_level='Bachelor\'s Degree/Undergraduate Degree'">

\ является escape-символом в большинстве языков и должен быть также для xslt.

0 голосов
/ 21 октября 2011

Escape 'в "степень бакалавра" - у вас есть education_level='Bachelor', а затем s Degree/Undergraduate Degree'. Попробуйте education_level='Bachelor\'s Degree/Undergraduate Degree'

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