Преобразование XML с использованием XSLT - PullRequest
5 голосов
/ 15 октября 2010

У меня есть собственный XML, который мне нужно преобразовать в другой формат XML, используя XSL.

Введите:

<Feed>
  <repository>
  <item-descriptor name="product">
  <property name="id">123</property>
  <property name="display">asdf</property>
  <property name="attr1">attr1</property>
  <property name="attr2">attr2</property>
  </item-descriptor>
  </repository>
</Feed>

Выход:

<Feed>
  <Products>
  <product>
  <id>123</id>
  <display>asdf</display>
  <attr1>attr1</attr>
  <attr2>attr2</attr2>
  </product>
  </Products>
</Feed>

Следующий XSL используется для получения желаемого результата.

XSL:

<xsl:template match="/">
  <xsl:apply-templates select="Feed"/>
  </xsl:template>
  <xsl:template match="Feed">
  <Feed>
  <Products>
  <xsl:apply-templates select="repository/item-descriptor[@name='product']"/>
  </Products>
  </Feed>
  </xsl:template>
  <xsl:template match="repository/item-descriptor[@name='product']">
  <product>
   <xsl:apply-templates select="property"/>
  </product>
  </xsl:template>
  <xsl:template match="property">
  <xsl:if test=@name='id'>
  <id><xsl:value-of select='.'></id>
  </xsl:if>  <xsl:if test=@name='display'>
  <display><xls:value-of select='.'></display>
  <xsl:if test=@name='attr1'>
  <attr1><xsl:value-of select='.'></attr1>
 </xsl:if>
  <xsl:if test=@name='attr2'>
 <attr2><xls:value-of select='.'></attr2>
</xsl:template>

Теперь мне нужно сгенерировать следующий вывод, пожалуйста, помогите мне изменить вышеуказанный XSL, чтобы получить вывод ниже:

<Feed>
  <Products>
  <product>
  <id>123</id>
  <display>asdf</display>
  <attributes>
  <aatr1>attr1</attr1>
  <attr2>attr2</attr2>
  </attributes>
  </product>
  </Products>
</Feed>

1 Ответ

3 голосов
/ 15 октября 2010

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

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

 <xsl:template match="/*">
  <Feed>
   <xsl:apply-templates/>
  </Feed>
 </xsl:template>

 <xsl:template match="*[item-descriptor/@name='product']">
  <Products>
   <xsl:apply-templates/>
  </Products>
 </xsl:template>

 <xsl:template match="item-descriptor[@name='product']">
  <product>
      <xsl:apply-templates select="*/@name[not(starts-with(.,'attr'))]"/>
      <attributes>
        <xsl:apply-templates select="*/@name[starts-with(.,'attr')]"/>
      </attributes>
  </product>
 </xsl:template>

 <xsl:template match="@name">
  <xsl:element name="{.}">
    <xsl:apply-templates select="../node()"/>
  </xsl:element>
 </xsl:template>
</xsl:stylesheet>

при применении к предоставленному XML-файлу :

<Feed>
    <repository>
        <item-descriptor name="product">
            <property name="id">123</property>
            <property name="display">asdf</property>
            <property name="attr1">attr1</property>
            <property name="attr2">attr2</property>
        </item-descriptor>
    </repository>
</Feed>

дает желаемый, правильный результат :

<Feed>
    <Products>
        <product>
            <id>123</id>
            <display>asdf</display>
            <attributes>
                <attr1>attr1</attr1>
                <attr2>attr2</attr2>
            </attributes>
        </product>
    </Products>
</Feed>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...