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

предполагая, что я получил следующий файл 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>

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

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


person Camal    schedule 03.05.2010    source источник


Ответы (1)


Я изменил значение в тесте на ../@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).

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

person Aliaksei Kliuchnikau    schedule 03.05.2010
comment
Во-первых, спасибо за повтор, но это решение не работает. Мой вывод теперь ‹Цвет двери=красный/›, но я хочу этот ‹Цвет двери=красный›Lamborghini‹/дверь› - person Camal; 03.05.2010
comment
Теперь я понял! Я просто добавил ‹xsl:apply-templates/› перед ‹/xsl:element› :) - person Camal; 03.05.2010