Bezdepbonusu7Программирование: статьи и ответы

Вопрос

Установите атрибут для всех дочерних элементов через xsl: выберите

Автор вопроса: CamalОтветов: 1

предполагая, что я получил следующий файл XML:

<?xml version="1.0" encoding="ISO-8859-1" ?>
<MyCarShop>
    <Car gender="Boy">
        <Door>Lamborghini</Door>
        <Key>Skull</Key>
    </Car>
    <Car gender="Girl">
        <Door>Normal</Door>
        <Key>Princess</Key>
    </Car>
</MyCarShop>

Я хочу выполнить преобразование, чтобы xml выглядел так:

<?xml version="1.0" encoding="ISO-8859-1" ?>
<MyCarShop>
    <Car gender="Boy">
        <Door color="blue">Lamborghini</Door>
        <Key color="blue">Skull</Key>
    </Car>
    <Car gender="Girl">
        <Door color="red">Normal</Door>
        <Key color="red">Princess</Key>
    </Car>
</MyCarShop>

Поэтому я хочу добавить атрибут цвета к каждому подэлементу автомобиля в зависимости от информации о поле.

Я придумал этот XSLT, но он не работает:

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:msxsl="urn:schemas-microsoft-com:xslt" exclude-result-prefixes="msxsl"
>
  <xsl:output method="xml" indent="yes"/>

  <!--<xsl:template match="@* | node()">
        <xsl:copy>
            <xsl:apply-templates select="@* | node()"/>
        </xsl:copy>
    </xsl:template>-->

  <xsl:template match="/">
    <xsl:element name="MyCarShop">
      <xsl:attribute name="version">1.0</xsl:attribute>
      <xsl:apply-templates/>
    </xsl:element>
  </xsl:template>

    <xsl:template match="Car">
    <xsl:element name="Car">
      <xsl:apply-templates/>
    </xsl:element>
  </xsl:template>

    <xsl:template match="Door">
    <xsl:element name="Door">
          <xsl:attribute name="ViewSideIndicator">
        <xsl:choose>
            <xsl:when test="gender = 'Boy' ">Front</xsl:when>
            <xsl:when test="gender = 'Girl ">Front</xsl:when>
        </xsl:choose>
    </xsl:attribute>
       </xsl:element>
  </xsl:template>

      <xsl:template match="Key">
    <xsl:element name="Key">
      <xsl:apply-templates/>
          </xsl:element>
  </xsl:template>

  </xsl:stylesheet>

Кто-нибудь знает, что может быть не так?

Спасибо еще раз!

xmlxslt

Ответы

Ответ 1 · рейтинг 2 · Aliaksei Kliuchnikau

Я изменил значение в тесте на ../@gender, и теперь этот шаблон добавляет атрибут цвета к узлу "Дверь" в зависимости от значения атрибута "пол" автомобиля. .. означает "получить родительский узел". @ означает "получить значение атрибута".

<xsl:template match="Door">
<xsl:element name="Door">
  <xsl:attribute name="color">
    <xsl:choose>
      <xsl:when test="../@gender = 'Boy' ">Red</xsl:when>
      <xsl:when test="../@gender = 'Girl' ">Green</xsl:when>
    </xsl:choose>
  </xsl:attribute>
</xsl:element>

You should do the same for 'Key' template (or better reuse the 'choose' code by extracting it into separate named template).

Надеюсь это поможет.

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы