2008 04 de agosto de 2008

Um problema com a posição () em XSL ... ou é?

Eu tive esse problema ao criar uma Armazenamento em XSL hoje. Procurava respostas em toda a rede, mas não poderia encontrar qualquer .... Na verdade, eu acho! Eu sei o que força o meu problema era, então o que devo procurar?

Enfim! Apenas no caso de você ter esse mesmo problema e também de alguma forma pelo poder a força que você conseguiu atingir esta página ... você poderia me agradecer toneladas ... E se você acidentalmente aterrou nesta página por algum estranho destino e tiver que ser um desenvolvedor XSL, fazem uma NOTA DESTE Agora, para a causa futuro, se algum dia, você enfrentar esse problema, então a força pode não ser com você.

Enunciado do problema:
Eu tenho esse XML, onde existem dois nós com vários itens em que os itens e entre estes dois nós têm uma correspondência um para um. No exemplo abaixo, cada item da <arrayname="PLAYURL" /> relaciona (posição correspondente) para um item na <arrayname="SITENAME" />

<?xml version="1.0" encoding="utf-8"?>
<myplaylists>
<playlist>
<title>Best of Rest </title>
<array name="SITENAME">
<str>www.musicindiaonline.com</str>
<str>www.dhingana.com</str>
<str>www.raaga.com</str>
<str>www.smashits.com</str>
<str>www.desimusic.com</str>
<str>www.musicplug.in</str>
</array>
<array name="PLAYURL">
<str>http://www.musicindiaonline.com/123/</str>
<str>http://www.dhingana.com/play/123</str>
<str>http://www.raaga.com/123</str>
<str>http://ww.smashits.com/123</str>
<str>http://www.desimusic.com/123</str>
<str>http://www.musicplug.in/123</str>
</array>
</playlist>
</myplaylists>

Agora, eu tenho um loop, onde i percorrer <array name="SITENAME">, e eu quero pegar o item relacionado (na posição correspondente) em <array name="PLAYURL">,

O que você normaly tentar fazer é ...

<xsl:for-each select="myplaylists/playlist/array[@name='SITENAME']/str">
play from : <a href="{../../array[@name='PLAY']/str[position()]}"/> <xsl:value-of select="." /></a>
</xsl:for-each>

DESCULPE! Isso não vai funcionar ... Ah!! Surpised ...

Agora você provavelmente quer tentar, algo assim ...

<xsl:for-each select="myplaylists/playlist/array[@name='SITENAME']/str">
<xsl:variable name="pos"> <xsl:value-of select="position()"/></xsl:variable>
play from : <a href="{../../array[@name='PLAY']/str[$pos]}"/> <xsl:value-of select="." /></a>
</xsl:for-each>

E Novamente, isto não vai funcionar ... Agora você coçar a cabeça, tentando entrar em contato com todos que você acha que sabe alguma XSL e poderia ser de alguma ajuda ... você tentar todas as opções de outros ... e ainda não vai funcionar ... Bem! Isso é o que aconteceu comigo pelo menos ...

DESESPERO NÃO FAZ! EXPERIMENTE ESTE

<xsl:for-each select="myplaylists/playlist/array[@name='SITENAME']/str">
<xsl:variable name="pos-int" select="position()" />
play from : <a href="{../../array[@name='PLAY']/str[$
<xsl:for-each select="myplaylists/playlist/array[@name='SITENAME']/str">
<xsl:variable name="pos-int" select="position()" />
play from : <a href="{../../array[@name='PLAY']/str[$ pos-int ]}"/> <xsl:value-of select="." /></a>
</xsl:for-each>
]}"/> <xsl:value-of select="." /></a>
</xsl:for-each>

Não me pergunte por que funciona. Porque eu não tenho um motivo certo ... se você fizer! Por favor, deixar um comentário. Pode ser muito útil. Também! se você tem título melhor para este post, fazer cair-me uma linha :)


2008 02 de agosto de 2008

Definir o DOCTYPE no XSL

Na semana passada eu criei um layout HTML / CSS progessive para um cliente, testei no IE6, IE7 e FF 3, parecia perfeitamente bem ... ATÉ! o layout foi mais baixo do ciclo manufacting. Ele falhou. Elementos de layout de página só fui em todo o lugar quando o layout HTML foi convertido em XSL e XML aplicada a ele ... Bummer!

Não foi possível dormir ok no fim de semana, na manhã antecipação da segunda-feira, quando eu vou ter que corrigir esse SH **. Mas agora ter um pouco experince em lidar com este tipo de situações (Peculiaridades do navegador, quero dizer), eu sabia que tinha a ver com nada, mas DOCTYPE .... e foi ...

O problema:
Você quer controle sobre o DOCTYPE, desde sua transformação vai incluir um DOCTYPE padrão explicitamente, e você layout ficará fora por um lance.

A solução:
XSLT especificações fornece métodos de saída para definir um DOCTYPE de escolha. Além disso, para nós desenvolvedores de interface do usuário, os tópicos de interesse seriam métodos de saída HTML e métodos de saída XML .

Bem! antes de você se cansar, aqui está a correção.

Por exemplo, se você tivesse o DOCTYPE seguinte na sua versão HTML:. -

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

Em seguida, no XSL você teria que ter o seguinte: -

<xsl:output method="html" doctype-system="http://www.w3.org/TR/html4/loose.dtd" doctype-public="-//W3C//DTD HTML 4.01 Transitional//EN" indent="yes" />

e Finalmente! certifique-se que sua saída XSLT obedece à DOCTYPE que você escolheu.


2008 4 de maio de 2008

Incluir XSL XSL dentro

Se XML / XSL transforma é o seu Domian, então há momentos em que queremos um pedaço de código dinâmico para ser usado item de biblioteca (para ser re-utilizável). O que quero dizer, provavelmente poderia ser mais claro com este cenário de exemplo.

Imagine que você está criando um site (e usando XML, XSL transfroms é claro) ea maioria das páginas teria um Módulo de Comentários. Bem! em seguida, copiar ou colar esse código em cada modelo de página (que eu não tenho dizer, mas fazer a manutenção e retrabalho um pesadelo) ou ainda melhor, você cria um arquivo de inclusão que pode ser puxado, onde quer que você o quer em sua página ( s) ...
Então, como vamos criar um arquivo XSL INCLUDE e incluí-lo dentro de outro arquivo XSL? Aqui está como ...

Apenas para tornar as coisas claras ... aqui está a lista rápida de arquivos que você criar ... aqui, estaremos incluindo informações sobre frutas e verduras em uma página pai chamado alimentos.

1. food.xml - arquivo de dados XML em que a transformação será aplicada
2. food.xsl - arquivo XSL principal, que irá transformar o nosso food.xml
3. inc_fruits.xsl - XSL incluir o arquivo que irá processar dados frutas
4. inc_vegtables.xsl - XSL incluir o arquivo que irá processar dados vetetables

Eu não acho que tenho explicar muito, os códigos para elementos acima referidos, será auto-explicativo ...

FOOD.XML


<?xml version="1.0" encoding="ISO-8859-1"?>
<?xml-stylesheet type="text/xsl" href="food.xsl"?>
<food>
<date>July 2008</date>
<description>All about things we eat everyday</description>
<fruits type="tropical">
<item name="mango" moreinfo="http://www.mango.com">Mango is the king of fruits</item>
<item name="banana" moreinfo="http://www.banana.com">Banana once a day , keeps the doctor away</item>
<item name="orange" moreinfo="http://www.orange.com">Orange is the color and rich in vitamin C</item>
<item name="Papaya" moreinfo="http://www.papaya.com">Papaya - Hot when raw, cold when ripe</item>
</fruits>

<vegetables>
<item name="spinach" moreinfo="http://www.spinach.com">Spinach is full of iron</item>
<item name="asparagus" moreinfo="http://www.asparagus.com">Asparagus contains loads of vitamin D </item>
<item name="fenugreek" moreinfo="http://www.fenugreek.com">Fenugreek is rich in vitamin C</item>
</vegetables>
</food>


FOOD.XSL


<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:include href="inc_fruits.xsl" />
<xsl:include href="inc_vegetables.xsl" />
<xsl:template match="/">
<html>
<head>
<title>Title</title>
</head>
<body>
<h3><xsl:value-of select="/food/description" /></h3>
Modification Date : <xsl:value-of select="/food/date" />
<hr/>
<h5> About Fruits</h5>
<xsl:call-template name="about_fruits"/>

<hr/>
<h5> About Vegetables</h5>
<xsl:call-template name="about_vegetables"/>

<hr/>
</ Body>
</ Html>
</ Xsl: template>
</ Xsl: stylesheet>


INC_FRUITS.XSL

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="html" encoding="iso-8859-1" />
<xsl:template name="about_fruits">
<xsl:for-each select="/food/fruits/item/@*">
attribute name : <xsl:value-of select="name()"/>
attribute value : <xsl:value-of select="."/> <br />
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>


INC_VEGETABLES.XSL

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="html" encoding="iso-8859-1" />
<xsl:template name="about_vegetables">
<xsl:for-each select="/food/vegetables/item/@*">
attribute name : <xsl:value-of select="name()"/>
attribute value : <xsl:value-of select="."/> <br/>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>

Download de todos os arquivos acima aqui (252 downloads)


2008 04 de abril de 2008

Trabalhando com atributos nó XML XSLT

Se você usar XML e XSL, então você pode ter vindo através de um tempo, quando você tem que brincar com atributos e valores de nós XML em XSL você. Eles são um monte de sites com informação de fôlego longo sobre isso, mas nenhum que eu encontrei foram breve e preciso ... Esta é nenhum tutorial XML / XSL, mas a minha tentativa de colocar em conjunto uma espécie de fraude lista ...

A amostra XML que iremos trabalhar com esta aparência ...

<?xml version="1.0" encoding="ISO-8859-1"?>
<?xml-stylesheet type="text/xsl" href="food.xsl"?>
<food>
<fruits type="tropical">
<item name="mango" moreinfo="http://www.mango.com">Mango is the king of fruits</item>
<item name="banana" moreinfo="http://www.banana.com">Banana once a day , keeps the doctor away</item>
<item name="orange" moreinfo="http://www.orange.com">Orange is the color and rich in vitamin C</item>
<item name="Papaya" moreinfo="http://www.papaya.com">Papaya - Hot when raw, cold when ripe</item>
</fruits>
</food>

Então vamos começar a transformar o nosso XML acima usando XSL

Exemplo 1: Exibindo valor em um atributo escolhido

<xsl:value-of select="/food/fruits/item[@name='orange']" /><br />
to get more information about <a href="{/food/fruits/item[@name='orange']/@moreinfo}" target="new" ><xsl:value-of select="/food/fruits/item[@name='orange']/@name" /> </a>

Resultado será parecido com HTML

Orange is the color and rich in vitamin C,
to get more information about <a href="http://www.orange.com" target="new">


Exemplo 2: Percorrer e mostrar todos os nomes de atributo XML e seus valores

<xsl:for-each select="/food/fruits/item/@*">
attribute name : <xsl:value-of select="name()"/>,
attribute value : <xsl:value-of select="."/> <br />
</xsl:for-each>

Resultado será parecido com HTML


attribute name : name, attribute value : mango
attribute name : moreinfo, attribute value : http://www.mango.com
attribute name : name, attribute value : banana
attribute name : moreinfo, attribute value : http://www.banana.com
attribute name : name, attribute value : orange
attribute name : moreinfo, attribute value : http://www.orange.com
attribute name : name, attribute value : Papaya
attribute name : moreinfo, attribute value : http://www.papaya.com


Download de todos os arquivos acima aqui (245 downloads)



Assista a este espaço, eu vou continuar atualizando esta com novas descobertas ...


NDK casa | Expressando IT | Palate Expressando | Penmenship Expressando | Awe Expressando | expressar-me