2015-03-13 5 views
-2

У меня есть inputXML как:преобразования XSLT для преобразования входного XML

<?xml version="1.0" encoding="UTF-8"?> 
<catalog> 
    <cd> 
     <title>Empire Burlesque</title> 
     <artist>Bob Dylan</artist> 
     <country>USA</country> 
     <company>Columbia</company> 
     <price>10.90</price> 
     <year>1985</year> 
    </cd> 
    <cd> 
     <title>Hide your heart</title> 
     <artist>Bonnie Tyler</artist> 
     <country>UK</country> 
     <company>CBS Records</company> 
     <price>9.90</price> 
     <year>1988</year> 
    </cd> 
    <cd> 
     <title>Greatest Hits</title> 
     <artist>Dolly Parton</artist> 
     <country>USA</country> 
     <company>RCA</company> 
     <price>9.90</price> 
     <year>1982</year> 
    </cd> 
    <cd> 
     <title>Still got the blues</title> 
     <artist>Gary Moore</artist> 
     <country>UK</country> 
     <company>Virgin records</company> 
     <price>10.20</price> 
     <year>1990</year> 
    </cd> 
    <cd> 
     <title>Eros</title> 
     <artist>Eros Ramazzotti</artist> 
     <country>EU</country> 
     <company>BMG</company> 
     <price>9.90</price> 
     <year>1997</year> 
    </cd> 
    <cd> 
     <title>One night only</title> 
     <artist>Bee Gees</artist> 
     <country>UK</country> 
     <company>Polydor</company> 
     <price>10.90</price> 
     <year>1998</year> 
    </cd> 
    <cd> 
     <title>Sylvias Mother</title> 
     <artist>Dr.Hook</artist> 
     <country>UK</country> 
     <company>CBS</company> 
     <price>8.10</price> 
     <year>1973</year> 
    </cd> 
    <cd> 
     <title>Maggie May</title> 
     <artist>Rod Stewart</artist> 
     <country>UK</country> 
     <company>Pickwick</company> 
     <price>8.50</price> 
     <year>1990</year> 
    </cd> 
    <cd> 
     <title>Romanza</title> 
     <artist>Andrea Bocelli</artist> 
     <country>EU</country> 
     <company>Polydor</company> 
     <price>10.80</price> 
     <year>1996</year> 
    </cd> 
    <cd> 
     <title>When a man loves a woman</title> 
     <artist>Percy Sledge</artist> 
     <country>USA</country> 
     <company>Atlantic</company> 
     <price>8.70</price> 
     <year>1987</year> 
    </cd> 
    <cd> 
     <title>Black angel</title> 
     <artist>Savage Rose</artist> 
     <country>EU</country> 
     <company>Mega</company> 
     <price>10.90</price> 
     <year>1995</year> 
    </cd> 
    <cd> 
     <title>1999 Grammy Nominees</title> 
     <artist>Many</artist> 
     <country>USA</country> 
     <company>Grammy</company> 
     <price>10.20</price> 
     <year>1999</year> 
    </cd> 
    <cd> 
     <title>For the good times</title> 
     <artist>Kenny Rogers</artist> 
     <country>UK</country> 
     <company>Mucik Master</company> 
     <price>8.70</price> 
     <year>1995</year> 
    </cd> 
    <cd> 
     <title>Big Willie style</title> 
     <artist>Will Smith</artist> 
     <country>USA</country> 
     <company>Columbia</company> 
     <price>9.90</price> 
     <year>1997</year> 
    </cd> 
    <cd> 
     <title>Tupelo Honey</title> 
     <artist>Van Morrison</artist> 
     <country>UK</country> 
     <company>Polydor</company> 
     <price>8.20</price> 
     <year>1971</year> 
    </cd> 
    <cd> 
     <title>Soulsville</title> 
     <artist>Jorn Hoel</artist> 
     <country>Norway</country> 
     <company>WEA</company> 
     <price>7.90</price> 
     <year>1996</year> 
    </cd> 
    <cd> 
     <title>The very best of</title> 
     <artist>Cat Stevens</artist> 
     <country>UK</country> 
     <company>Island</company> 
     <price>8.90</price> 
     <year>1990</year> 
    </cd> 
    <cd> 
     <title>Stop</title> 
     <artist>Sam Brown</artist> 
     <country>UK</country> 
     <company>A and M</company> 
     <price>8.90</price> 
     <year>1988</year> 
    </cd> 
    <cd> 
     <title>Bridge of Spies</title> 
     <artist>T`Pau</artist> 
     <country>UK</country> 
     <company>Siren</company> 
     <price>7.90</price> 
     <year>1987</year> 
    </cd> 
    <cd> 
     <title>Private Dancer</title> 
     <artist>Tina Turner</artist> 
     <country>UK</country> 
     <company>Capitol</company> 
     <price>8.90</price> 
     <year>1983</year> 
    </cd> 
    <cd> 
     <title>Midt om natten</title> 
     <artist>Kim Larsen</artist> 
     <country>EU</country> 
     <company>Medley</company> 
     <price>7.80</price> 
     <year>1983</year> 
    </cd> 
    <cd> 
     <title>Pavarotti Gala Concert</title> 
     <artist>Luciano Pavarotti</artist> 
     <country>UK</country> 
     <company>DECCA</company> 
     <price>9.90</price> 
     <year>1991</year> 
    </cd> 
    <cd> 
     <title>The dock of the bay</title> 
     <artist>Otis Redding</artist> 
     <country>USA</country> 
     <company>Atlantic</company> 
     <price>7.90</price> 
     <year>1987</year> 
    </cd> 
    <cd> 
     <title>Picture book</title> 
     <artist>Simply Red</artist> 
     <country>EU</country> 
     <company>Elektra</company> 
     <price>7.20</price> 
     <year>1985</year> 
    </cd> 
    <cd> 
     <title>Red</title> 
     <artist>The Communards</artist> 
     <country>UK</country> 
     <company>London</company> 
     <price>7.80</price> 
     <year>1987</year> 
    </cd> 
    <cd> 
     <title>Unchain my heart</title> 
     <artist>Joe Cocker</artist> 
     <country>USA</country> 
     <company>EMI</company> 
     <price>8.20</price> 
     <year>1987</year> 
    </cd> 
</catalog> 

Теперь мое требование, чтобы проверить, если цена меньше, чем 10, то изменить это значение на 15,91 и показать измененный входной XML в качестве выходного XML ,

У меня очень мало знаний о xslt, так сильно ударил здесь.

Пожалуйста, помогите в этом отношении. Ждем ваших ответов.

+1

Вам посчастливилось получить ответ на этот вопрос. Вопросы формы «пожалуйста, напишите мою программу для меня, потому что я еще не взял на себя труд, чтобы изучить язык программирования», как правило, получают довольно короткий стресс. –

ответ

1

Во-первых, вы должны узнать о XSLT Identity Template, который выглядит следующим образом:

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

по себе, он будет копировать все атрибуты и узлы к выходу без изменений (так что ваш выход будет точно такой же, как ваш вход). Это означает, что вам тогда нужно только писать шаблоны для битов XML, которые вам нужно изменить. Шаблон идентичности заботится обо всем остальном.

Вы говорите, что вы хотите изменить price элементов, значение которых меньше 10. Поэтому вам нужен простой шаблон, чтобы соответствовать таким элементам

<xsl:template match="price[number(.) &lt; 10]"> 

И в этом шаблоне, вы можете просто скопировать price элемент, но измените значение на 15.90 в соответствии с требованиями

<xsl:copy> 
    <xsl:text>15.90</xsl:text> 
</xsl:copy> 

Попробуйте XSLT

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

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

    <xsl:template match="price[number(.) &lt; 10]"> 
     <xsl:copy> 
      <xsl:text>15.90</xsl:text> 
     </xsl:copy> 
    </xsl:template> 
</xsl:stylesheet> 

Примечание. Вы также можете написать шаблон следующим образом, чтобы вы соответствовали текстовому узлу под price, а не price, что означает, что вам не нужно будет добавлять код для воссоздания элемента price.

<xsl:template match="price/text()[number() &lt; 10]"> 
    <xsl:text>15.90</xsl:text> 
</xsl:template> 
Смежные вопросы