Преобразование личности в XSLT - PullRequest
3 голосов
/ 30 декабря 2011

У меня есть этот исходный XML:

<?xml version="1.0"?>
<root>
   <item1>
      <name>test</name>
      <price>160</price>
      <stock>4</stock>
      <country>Belgium</country>
   </item1>
   <item2>
      <name>Alfa</name>

      <price>140</price>

      <stock>3</stock>

      <country>Turkey</country>
   </item2>
   <item3>
      <name>Beta</name>

      <price>110</price>

      <stock>48</stock>

      <country>Holland</country>
   </item3>
   <product id="p1">
      <name>Delta</name>

      <price>800</price>

      <stock>4</stock>

      <country>Denmark</country>
   </product>
   <product id="p2">
      <name>Golf</name>

      <price>1000</price>

      <stock>5</stock>

      <country>Germany</country>
   </product>
   <product id="p3">
      <name>Alfa</name>

      <price>1200</price>

      <stock>19</stock>

      <country>Germany</country>
   </product>
   <product id="p4">
      <name>Foxtrot</name>

      <price>1500</price>

      <stock>5</stock>

      <country>Australia</country>
   </product>
   <product id="p5">
      <name>Tango</name>

      <price>1225</price>

      <stock>3</stock>

      <country>Japan</country>
   </product>
</root>

И я хочу, чтобы он выглядел так:

<?xml version="1.0"?>
<root>
   <action>
      <name>test</name>

      <price>160</price>

      <stock>4</stock>

      <country>Belgium</country>
   </action>
   <action>
      <name>Alfa</name>

      <price>140</price>

      <stock>3</stock>

      <country>Turkey</country>
   </action>
   <action>
      <name>Beta</name>

      <price>110</price>

      <stock>48</stock>

      <country>Holland</country>
   </action>
   <action>
      <name>Delta</name>

      <price>800</price>

      <stock>4</stock>

      <country>Denmark</country>
   </action>
   <action>
      <name>Golf</name>

      <price>1000</price>

      <stock>5</stock>

      <country>Germany</country>
   </action>
   <action>
      <name>Alfa</name>

      <price>1200</price>

      <stock>19</stock>

      <country>Germany</country>
   </action>
   <action>
      <name>Foxtrot</name>

      <price>1500</price>

      <stock>5</stock>

      <country>Australia</country>
   </action>
   <action>
      <name>Tango</name>

      <price>1225</price>

      <stock>3</stock>

      <country>Japan</country>
   </action>
</root>

Так что <item1> до <item3> превращаются в

<action>

И <product> теряет свой атрибут, а также превращается в

<action>

Может кто-нибудь показать мне, как это сделать с XSLT?Потому что у меня сейчас есть 2 разных XSL.И я хочу объединить их, чтобы создать только один XSL.

Заранее спасибо

Ответы [ 3 ]

14 голосов
/ 30 декабря 2011

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

<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="node()|@*">
     <xsl:copy>
       <xsl:apply-templates select="node()|@*"/>
     </xsl:copy>
 </xsl:template>

 <xsl:template match="product|*[starts-with(name(), 'item')]">
  <action>
   <xsl:apply-templates select="node()|@*"/>
  </action>
 </xsl:template>

 <xsl:template match="product/@id"/>
</xsl:stylesheet>

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

<root>
    <item1>
        <name>test</name>
        <price>160</price>
        <stock>4</stock>
        <country>Belgium</country>
    </item1>
    <item2>
        <name>Alfa</name>
        <price>140</price>
        <stock>3</stock>
        <country>Turkey</country>
    </item2>
    <item3>
        <name>Beta</name>
        <price>110</price>
        <stock>48</stock>
        <country>Holland</country>
    </item3>
    <product id="p1">
        <name>Delta</name>
        <price>800</price>
        <stock>4</stock>
        <country>Denmark</country>
    </product>
    <product id="p2">
        <name>Golf</name>
        <price>1000</price>
        <stock>5</stock>
        <country>Germany</country>
    </product>
    <product id="p3">
        <name>Alfa</name>
        <price>1200</price>
        <stock>19</stock>
        <country>Germany</country>
    </product>
    <product id="p4">
        <name>Foxtrot</name>
        <price>1500</price>
        <stock>5</stock>
        <country>Australia</country>
    </product>
    <product id="p5">
        <name>Tango</name>
        <price>1225</price>
        <stock>3</stock>
        <country>Japan</country>
    </product>
</root>

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

<root>
   <action>
      <name>test</name>
      <price>160</price>
      <stock>4</stock>
      <country>Belgium</country>
   </action>
   <action>
      <name>Alfa</name>
      <price>140</price>
      <stock>3</stock>
      <country>Turkey</country>
   </action>
   <action>
      <name>Beta</name>
      <price>110</price>
      <stock>48</stock>
      <country>Holland</country>
   </action>
   <action>
      <name>Delta</name>
      <price>800</price>
      <stock>4</stock>
      <country>Denmark</country>
   </action>
   <action>
      <name>Golf</name>
      <price>1000</price>
      <stock>5</stock>
      <country>Germany</country>
   </action>
   <action>
      <name>Alfa</name>
      <price>1200</price>
      <stock>19</stock>
      <country>Germany</country>
   </action>
   <action>
      <name>Foxtrot</name>
      <price>1500</price>
      <stock>5</stock>
      <country>Australia</country>
   </action>
   <action>
      <name>Tango</name>
      <price>1225</price>
      <stock>3</stock>
      <country>Japan</country>
   </action>
</root>

Объяснение

  1. Правило идентификации копирует каждый узел "как есть".

  2. У нас есть два шаблона, переопределяющих правило идентификации. Первый шаблон соответствует любому product или любому элементу, имя которого начинается со строки item. Он эффективно «переименовывает» соответствующий элемент в action, создавая и выводя элемент action.

  3. Второй переопределяющий шаблон соответствует любому атрибуту id любого элемента product. Этот шаблон не имеет тела, что эффективно «удаляет» соответствующий атрибут - он не копируется / воссоздается в выходных данных.

1 голос
/ 30 декабря 2011

Звучит просто:

<xsl:stylesheet
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  version="1.0">

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

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

</xsl:stylesheet>

Если вы хотите, чтобы мы объединили ваш существующий код, вы должны опубликовать его.

0 голосов
/ 30 декабря 2011

Вы также можете просто пройти через это и построить его так, как вам нравится. Пример:

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

    <xsl:template match="/root">
        <xsl:element name="root">
            <xsl:for-each select="node()">
                <xsl:element name="action">
                    <xsl:element name="name"><xsl:value-of select="name"/></xsl:element>
                    <xsl:element name="price"><xsl:value-of select="price"/></xsl:element>
                    <xsl:element name="stock"><xsl:value-of select="stock"/></xsl:element>
                    <xsl:element name="country"><xsl:value-of select="country"/></xsl:element>
                </xsl:element>
            </xsl:for-each>
        </xsl:element>
    </xsl:template>
</xsl:stylesheet>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...