Pergunta

É possível dividir uma tag no canto inferior aos limites maiúsculas ou seja, por exemplo, tag 'UserLicenseCode' deve ser convertido em 'Licença de Usuário Code' de modo que os cabeçalhos de coluna olhar um pouco mais agradável.

Eu fiz algo parecido com isso no passado usando expressões regulares do Perl, mas XSLT é um jogo totalmente novo para mim.

Os ponteiros na criação de um tal modelo seria muito apreciada!

Graças Krishna

Foi útil?

Solução

Usando recursão, é possível caminhar por uma corda em XSLT para avaliar cada personagem. Para fazer isso, criar um novo modelo que aceita apenas um parâmetro string. Confira o primeiro caractere e se é um carácter maiúsculo, escreva um espaço. Em seguida, escreva o personagem. Em seguida, chame o modelo novamente com os caracteres restantes dentro de uma única cadeia. Isso resultaria no que você quer fazer.

Isso seria o ponteiro. Vou precisar de algum tempo para trabalhar fora do modelo. :-)


Demorou alguns testes, especialmente para obter o espaço dentro da coisa toda. (I mal utilizado um personagem para este!) Mas este código deve dar-lhe uma idéia ...

Eu usei esse XML:

<?xml version="1.0" encoding="UTF-8"?>
<blah>UserLicenseCode</blah>

e, em seguida, esta folha de estilo:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:fo="http://www.w3.org/1999/XSL/Format">
    <xsl:output method="text"/>
    <xsl:variable name="Space">*</xsl:variable>
    <xsl:template match="blah">
    <xsl:variable name="Split">
        <xsl:call-template name="Split">
            <xsl:with-param name="Value" select="."/>
            <xsl:with-param name="First" select="true()"/>
        </xsl:call-template></xsl:variable>
        <xsl:value-of select="translate($Split, '*', ' ')" />
    </xsl:template>
    <xsl:template name="Split">
        <xsl:param name="Value"/>
        <xsl:param name="First" select="false()"/>
        <xsl:if test="$Value!=''">
            <xsl:variable name="FirstChar" select="substring($Value, 1, 1)"/>
            <xsl:variable name="Rest" select="substring-after($Value, $FirstChar)"/>
                <xsl:if test="not($First)">
                    <xsl:if test="translate($FirstChar, 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', '..........................')= '.'">
                        <xsl:value-of select="$Space"/>
                    </xsl:if>
                </xsl:if>
                <xsl:value-of select="$FirstChar"/>
                <xsl:call-template name="Split">
                    <xsl:with-param name="Value" select="$Rest"/>
                </xsl:call-template>
        </xsl:if>
    </xsl:template>
</xsl:stylesheet>

e eu tenho isso como resultado:

User License Code

Tenha em mente que os espaços e outros caracteres de espaço em branco tendem a ser arrancada do XML, que é por isso que eu usei um '*' em vez disso, que traduzi para um espaço.

Claro que, este código pode ser melhorado. É o que eu poderia vir acima com em 10 minutos de trabalho. Em outras línguas, levaria menos linhas de código, mas em XSLT ainda é bastante rápido, considerando a quantidade de linhas de código que ele contém.

Outras dicas

Solução Um XSLT + FXSL (em XSLT 2.0, mas quase o mesmo código irá trabalhar com XSLT 1.0 e FXSL 1.x :

<xsl:stylesheet version="2.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:f="http://fxsl.sf.net/"
xmlns:testmap="testmap"
exclude-result-prefixes="f testmap"
>
   <xsl:import href="../f/func-str-dvc-map.xsl"/>
   <testmap:testmap/>

   <xsl:output omit-xml-declaration="yes" indent="yes"/>

   <xsl:template match="/">
     <xsl:variable name="vTestMap" select="document('')/*/testmap:*[1]"/>

     '<xsl:value-of select="f:str-map($vTestMap, 'UserLicenseCode')"
       />'
   </xsl:template>

    <xsl:template name="mySplit" match="*[namespace-uri() = 'testmap']"
     mode="f:FXSL">
      <xsl:param name="arg1"/>

      <xsl:value-of select=
       "if(lower-case($arg1) ne $arg1)
         then concat(' ', $arg1)
         else $arg1
       "/>
    </xsl:template>
</xsl:stylesheet>

Quando a transformação acima é aplicado em qualquer documento XML de origem (não utilizado), o resultado correto esperado é produzido:

'Licença de Usuário Código'

Do nota :

  1. Nós estamos usando a versão DVC da função FXSL / template str-map() . Esta é uma função de ordem superior (HOF) que leva dois argumentos: uma outra função e uma corda. str-map() se aplica a função em cada caractere da string e retorna a concatenação dos resultados.

  2. Como a função minúsculas () é usada (na versão XSLT 2.0), não estamos restritos a apenas o alfabeto latino.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top