Как изменить атрибут xml с помощью xslt

у меня есть атрибут xml dsc:

<DMD dsc = "1">

В схеме

<xs:attribute name = "dsc" type = "xs:boolean" use = "required"/>

Я хочу изменить значение «0» на «нет» и «1» на «да».

Мой xslt:

<td style = "padding-left:10px; width:1.64in; ">
            <xsl:for-each select = "@dsc">
                <span style = "color:#0024c0; ">
                   <xsl:value-of select = "string(.)"/>                                                               
               </span>
            </xsl:for-each>
        </td>

Я попробовал xsl: template match и xsl: choose, но у меня все еще нет решения. Я могу преобразовывать элементы, но не атрибут. Спасибо

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

zx485 01.05.2018 19:34
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
1
58
3

Ответы 3

XPath @dsc верен, если вы находитесь в контексте элемента DMD, но он не виден из-за частичного размещенного вами XSL.

Если вы не в контексте DMD, xpath будет whatever/elements/DMD/@dsc.

Однако сокращенная форма . предназначена для текущего элемента. Насколько мне известно, вы не можете использовать это для получения значения атрибута.

И я не понимаю, зачем вы делаете цикл с xsl:for-each. Есть только один атрибут dsc.

проверьте этот код

 <td style = "padding-left:10px; width:1.64in; ">
        <xsl:for-each select = "//@dsc">
            <span style = "color:#0024c0; ">
            <xsl:choose>
                <xsl:when test = "//@dsc='1'"><xsl:text>yes</xsl:text></xsl:when>
                <xsl:otherwise><xsl:text>no</xsl:text></xsl:otherwise>
                </xsl:choose>
           </span>
        </xsl:for-each>
    </td>

он работает, но элемент DMD имеет maxOccurs без привязки <xs: element name = "DMD" type = "DMDType" minOccurs = "0" maxOccurs = "unbounded" />. Когда у меня есть один элемент, все в порядке, наконец, у меня есть «да», когда атрибут равен «1». Но когда у меня более одного элемента DMD, все атрибуты имеют значение «да», несмотря на то, что некоторые из них имеют значение «0».

Romek 02.05.2018 17:24

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

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

  <!-- identity template - copy all (other) nodes as given -->
  <xsl:template match = "node()|@*">
    <xsl:copy>
        <xsl:apply-templates select = "node()|@*"/>
    </xsl:copy>
  </xsl:template>

  <!-- Replace '1' attribute values with 'yes' values -->
  <xsl:template match = "@dsc[.='1']">
    <xsl:attribute name = "dsc">
        <xsl:value-of select = "'yes'"/>
    </xsl:attribute>
  </xsl:template>

  <!-- Replace '0' attribute values with 'no' values -->
  <xsl:template match = "@dsc[.='0']">
    <xsl:attribute name = "dsc">
        <xsl:value-of select = "'no'"/>
    </xsl:attribute>
  </xsl:template>

</xsl:stylesheet>

В моем xslt есть шаблон перед тегом <html>: <xsl: template match = "/"> Я добавил Ваш код после </ xsl: template> в конце xslt, но теперь xslt не конвертирует значение, но "0" или «1» просто исчезла из визуализации. Поле пустое.

Romek 02.05.2018 16:02

Порядок шаблонов не имеет значения в XSLT, важно то, какие шаблоны выполняются. Попробуйте добавить <apply-templates /> в свой шаблон <html>. Или покажите большую часть реального кода.

zx485 02.05.2018 16:55

Другие вопросы по теме