2009 07 de marco de 2009

Chamando Múltiplas Funções onload do Windows em Javascript

Heres outro pedaço pouco de malandragem Javascript que eu tive que cavar em volta porque a situação commaned-lo. Em um dos meus sites da Web, eu tive esta situação onde eu tive que implementar "windows.onload" duas vezes. A primeira coisa que veio à mente um inexperiente como o meu (eu tenho que dizer honestamente que, uma vez que tenho vindo a utilizar frameworks JavaScript e bibliotecas, eu forgotton para fazer coisas simples no meu próprio ... triste mas é verdade), é o seguinte método ...

 window.onload = onloadfn1;
 window.onload = onloadfn2;
 window.onload = onloadfn3;
 etc ..

Desculpe dizer, mas, isso não vai funcionar ... não quero discutir a ciência execução de Javascript muito ... mas de acordo com minha experiência recente, apenas a função anterior (onloadfn3) vai realmente mal executada.

Em situações normais, ao contrário do meu (que eu vou falar um pouco mais tarde) ... você poderia fazer uma das seguintes opções para executar funções de onload mutliple ....

Ou algo assim

 doOnLoad function () {
         onloadfn1 ();
         onloadfn2 ();
         onloadfn3 ();
 }
 window.onload = doOnLoad;

Para a minha situação atual, eu não posso usar qualquer um dos acima ...
Por que eu preciso chamar windows.onload duas vezes, ao invés de chamar duas funções dentro de uma função onload único? Aqui é rápido olhar para a minha declaração do problema ...

"Páginas de meu site são estruturados como o tema do WordPress .... ou seja, há um header.php e footer.php comuns que é incluído em todas as páginas do site. Há uma implementaion função onload nos footer.php para fazer algumas funções onload comuns. E há poucas páginas que precisam de algo de sua própria OnLoad, além daqueles feitos pela função onload comum. Se eu atribuir função de callback diretamente para o manipulador de window.onload, ele irá sobrepor-se callbacks previamente designados nos footer.php "

.... O meu problema entendido :) ?

Bem! existem poucas soluções que eu encontrei. Todos eles são muito semelhantes e, principalmente, implementions de uma solução dada por Simon Willison ( http://simonwillison.net/2004/May/26/addLoadEvent/ ) ...

Solução:

Basta adicionar este código javascript para o site ...

 addLoadEvent função (func) {
     var oldonload = window.onload;
     if (typeof window.onload! = 'função') {
        window.onload = func
     Else {}
        window.onload = function () {
            if (oldonload) {
                   oldonload ()
           }
           func ()
        }
    }
 }

E chamá-lo de vez da "windows.onload" usual

 addLoadEvent (FunctionToRunOnPageLoad);
 addLoadEvent (function () {
 / * Mais código para ser executado no carregamento da página *
 }); 

As vantagens deste trecho de código ...
1. Primeiramente, Ele permite que você tem eventos windows.onload múltiplos, chamados de partes separadas do seu código, sem overridding a definição anterior
2. É muito discreto. Pode ser colocado em um arquivo com seus outros scripts ou em um arquivo separado.
3. Ele funciona mesmo window.onload já foi definido.


2008 20 de setembro de 2008

TEXTAREA problema do colapso em XSL / XSLT


Enunciado do problema:
Corri para este problema em relação textareas em XSLs. Em palavras simples, o problema surge quando você tem uma tag <textarea> em branco, então ele irá recolhê-lo para <textarea />.
ou seja, se você tivesse algo como o seguinte em seu XSL e os dados XML para o valor TEXTAREA, retorna nada ...

<textarea name='description'> <xsl:value-of select="DESCRIPTION"/> </ textarea>

Como os navegadores não reconhecem isso, fará com que o resto do formulário HTML para ser executado na área de texto.

Possíveis soluções:

No XSL, adicione um espaço sem quebra-() após o xsl: tag.BEWARE valor, para cuidar deste espaço extra que é adicionado, durante validações do lado do cliente da área.

<textarea name='description'> <xsl:value-of select="DESCRIPTION"/> </ textarea>

Ou
<xsl:value-of select="concat (DESCRIPTION,'')"/>

Ou
Insira um <xsl:value-of select="@unknown" tag /> apontando para um atributo desconhecido. Isto irá forçar o PHP parser XSLT para gerar uma abertura e de encerramento tag área de texto, mesmo que isso não tem nada no meio.

Ou
Inserir um campo de <xsl:text> contendo um espaço para forçar uma marca de fechamento.

No entanto, embora as soluções acima mencionadas pode parecer para corrigir o problema, ainda não estou convencido de que elas estão certas e melhores maneiras de corrigi-lo. Se houver qualquer outra maneira melhor de corrigir esse equívoco, por favor, deixe-nos saber.


2008 14 setembro de 2008

Uma variedade de condições de teste XSL (Coleção de XSL: IF e XSL: Condições Quando o teste)

Toda vez que eu tenho que fazer um XSL: IF ou XSL: Quando o teste, eu tenho voltar para os livros de referência. Eu nunca me lembro deles. Pensei que haveria mais lá fora, assim como eu, que preferem preferem ter todos eles, possível, em um lugar, pronto para ser encaminhado, quando necessário.

Para aqueles que são novos ... Sintaxe para XSL: SE

<xsl:if test="expression">
<- Conteúdo: template ->
</ Xsl: if>

O xsl: if / xsl: quando o conjunto de teste
As condições abaixo são todas simples e auto-explicativo. Então eu acredito que não vai precisar de muita explicação

<xsl:if test="position()=last()-1">
Isto se o elemento penúltimo na lista!
</ Xsl: if>

<xsl:if test="SALARY> 5000 ">
O salário dessa pessoa é maior do que Rs. 5000
</ Xsl: if>

<xsl:if test="count(JOBS)> 3 ">
Há mais de 3 vagas de emprego nesta lista!
</ Xsl: if>

<xsl:if test="(@DEPT ='SALES') ou (@JOINYEAR = '1997')">
Esta pessoa é a partir de departamento de vendas ou o seu ano de adesão é 1997
</ Xsl: if>

<xsl:if test="EXPERIENCE">
Esta pessoa tem pelo menos um elemento filho EXPERIÊNCIA.
</ Xsl: if>

<xsl:if test="@HOBBY">
A pessoa tem um atributo hobby.
</ Xsl: if>

As condições texto mesmos poderiam ser usados ​​para xsl: choose / XSL: QUANDO bem

xsl: choose

Xsl XSLT de instrução: escolher é semelhante ao xsl: if, mas tem algumas diferenças fundamentais poucos:
• Um elemento xsl: choose pode testar mais de uma condição e adicionar diferentes nós da árvore de resultado com base em que condição for verdadeira.
• Um xsl: choose elemento pode ter um modelo padrão para adicionar à árvore de resultado, se nenhuma das condições forem verdadeiras. (Compare xsl: if, que não tem equivalente de uma condição "else").
• O xsl: choose elemento tem subelementos específicos que são necessários para que ele funcione, enquanto você pode colocar todos os elementos bem formados que você quer dentro de um xsl: if elemento.

<xsl:choose>
<xsl:when test="boolean-expression">
Faça alguma coisa quando este boolean expressão é TURE
</ Xsl: when>
<xsl:otherwise> fazer outra coisa </ xsl: otherwise>
</ Xsl: choose>


2008 13 de agosto de 2008

Tokenizing seqüência de caracteres delimitada dentro de um XSL

Se a sua exigência é para dividir um valor de nó em um XML, que contém uma seqüência de caracteres delimitada de valor, em itens individuais, então você chegou ao lugar certo ... ter um olhar para o exemplo abaixo. Se você está familiarizado com um pouco de XML e XSL ... Eu não acho que você iria precisar de qualquer explicação.
Além disso, este exemplo inclui o uso de funções como XSL xsl: call-template, xsl: substring, antes, xsl: substring-after, se é isso que você está depois.

XML para ser transformado (food.xml): -
Suponha que a tarefa é tokenize a seqüência de caracteres delimitados por vírgula, nos a tag "keywords"

<?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>
<keywords>Fruits, Vegetables, Pulses, Meat, Cereals </keywords>
</food>

XSL (food.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="utf-8" doctype-public="-//W3C//DTD XHTML 1.0 Transitional//EN" doctype-system="http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"/>
<xsl:template match="/">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<title>XSL 1.0 Delimited String Tokeniser</title>
</head>
<body>
<xsl:value-of select="food/meta"/>
<div >
<xsl:call-template name="tokenize">
<xsl:with-param name="string" select="food/keywords" />
<xsl:with-param name="delimitr" select="','" />
</xsl:call-template>

</div>
</body>
</html>
</xsl:template>
<xsl:template name="tokenize">
<xsl:param name="string" />
<xsl:param name="delimitr" />
<xsl:choose>
<xsl:when test="contains($string, $delimitr)">
<div style="border:1px solid red;">
<h3><xsl:value-of select="substring-before($string,$delimitr)" /></h3>
<xsl:variable name="data" select="substring-before($string,$delimitr)"/>
</div>
<xsl:call-template name="tokenize">
<xsl:with-param name="string" select="substring-after($string, $delimitr)" /><xsl:with-param name="delimitr" select="$delimitr" /></xsl:call-template>
</xsl:when>
<xsl:otherwise>
<div style="border:1px solid red;">
<h3><xsl:value-of select="$string" /></h3>
</div>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
</xsl:stylesheet>

Resultante de saída HTML: -

<div>
<div style="border: 1px solid red;">
<h3>Fruits</h3>
</div>
<div style="border: 1px solid red;">
<h3> Vegetables</h3>
</div>
<div style="border: 1px solid red;">
<h3> Pulses</h3>
</div>
<div style="border: 1px solid red;">
<h3> Meat</h3>
</div>
<div style="border: 1px solid red;">
<h3> Cereals </h3>
</div>
</div>

Escusado será dizer ... basta alterar o parâmetro "delimitr" para o delimitador de sua escolha


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