Como posso verificar se um valor é nulo ou vazio com XSL ?
Por exemplo, se categoryName
está vazio? Eu estou usando um ao escolher construir.
Por exemplo:
<xsl:choose>
<xsl:when test="categoryName !=null">
<xsl:value-of select="categoryName " />
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="other" />
</xsl:otherwise>
</xsl:choose>
xsl:when
para testes de nó. Considere<xsl:template match="Category[categoryName[not(node())]]">...
junto com a<xsl:template match="Category">...
. O processador tomará as decisões corretas para você e você não precisará mais escrever a lógica de negócios no aninhadoxsl:choose
. Em muitos casos, o uso de modelos correspondentes facilita a escrita de folhas de estilo.Respostas:
Edit : Isso cobre a interpretação mais provável, na minha opinião, de "[não] nulo ou vazio", como inferido da pergunta, incluindo seu pseudo-código e minha própria experiência inicial com o XSLT. Ou seja, "Qual é o equivalente do seguinte Java?":
Para obter mais detalhes, por exemplo, identificando claramente nulo x vazio, consulte a resposta de johnvey abaixo e / ou o 'violino' do XSLT que adaptei dessa resposta, que inclui a opção no comentário de Michael Kay e a sexta interpretação possível.
fonte
test="not(categoryName = '')"
. A resposta fornecida retornará false se o elemento categoryName estiver ausente, o que, na minha interpretação da pergunta, faz com que seja uma resposta errada.<xsl:for-each select="root/*[matches(name(.), 'grp')]">
para que possa ser usado no VS2010?Na ausência de outras informações, assumirei o seguinte XML:
Um exemplo de caso de uso seria semelhante a:
fonte
</CategoryName>
? , Testes de cordas vazias não funcionam para isso</CategoryName>
, nem há necessidade.Do elemento vazio :
Para testar se o valor de um determinado nó está vazio
Depende do que você quer dizer com vazio.
not(node())
not(string(.))
not(normalize-space(.))
not(node()[not(self::comment())])
fonte
not(text())
. Uma alternativa para o seu segundo marcador também énot(.//text())
. Como mostra seu último marcador: existem várias maneiras de considerar o "nada";).if ($mystring) then ... else ...
A respeito?
fonte
<categoryName> <!-- some comment --> </categoryName>
e, de outro modo, nenhum texto significativo, ele ainda é avaliado comotrue
Os dois primeiros tratam com valor nulo e os dois segundos tratam com a string vazia.
fonte
xsl:apply-templates
e combine modelos para obter o que deseja, muito mais fácil.Em alguns casos, convém saber quando o valor é especificamente nulo, o que é particularmente necessário ao usar XML que foi serializado a partir de objetos .NET. Embora a resposta aceita funcione para isso, ela também retorna o mesmo resultado quando a string está em branco ou vazia, ou seja, '', para que você não possa diferenciar.
Então você pode simplesmente testar o atributo.
Às vezes, é necessário saber o estado exato e você não pode simplesmente verificar se CategoryName é instanciado, porque, diferentemente do Javascript
Retornará true para um elemento nulo.
fonte
Sei que essa pergunta é antiga, mas entre todas as respostas, sinto falta de uma que seja uma abordagem comum para esse caso de uso no desenvolvimento de XSLT.
Estou imaginando que o código ausente do OP se parece com isso:
E que a entrada se parece com isso:
Ou seja, suponho que pode haver zero, vazio, único ou vários
categoryName
elementos. Lidar com todos esses casos usandoxsl:choose
construções de estilo-ou, em outras palavras, imperativamente, está ficando rapidamente confuso (ainda mais se os elementos puderem estar em níveis diferentes!). Um idioma típico de programação no XSLT está usando modelos (daí o T no XSLT), que é uma programação declarativa, não imperativa (você não diz ao processador o que fazer, apenas diz o que deseja obter, se determinadas condições forem atendidas). Para este caso de uso, isso pode ser algo como o seguinte:Isso funciona (com qualquer versão XSLT), porque o primeiro acima tem uma precedência mais alta (tem um predicado). O modelo correspondente "fall-through", o segundo, captura qualquer coisa que não seja válida. O terceiro, então, cuida da saída do
categoryName
valor de maneira adequada.Observe que, nesse cenário, não há necessidade de corresponder
categories
oucategory
camente , porque o processador processará automaticamente todos os filhos, a menos que seja indicado o contrário (neste exemplo, o segundo e o terceiro modelo não processam mais os filhos, porque não háxsl:apply-templates
em eles).Essa abordagem é mais facilmente extensível que a abordagem imperativa, porque lida automaticamente com várias categorias e pode ser expandida para outros elementos ou exceções apenas adicionando outro modelo correspondente. Programação sem if-branches .
Nota: não existe
null
XML. Existe xsi: nil , mas isso raramente é usado, especialmente raramente em cenários sem tipo, sem um esquema de algum tipo.fonte
Essa é provavelmente a expressão XPath mais simples (a resposta aceita fornece um teste para o oposto e seria mais longo, se negado):
Explicação :
O argumento para a
not()
função acima éfalse()
exatamente quando não hácategoryName
filho ("nulo") do item de contexto ou ocategoryName
filho (único) possui valor de sequência - a sequência vazia.No XSLT 2.0, use :
Aqui está um exemplo completo :
Quando essa transformação é aplicada no seguinte documento XML:
o resultado desejado e correto é produzido :
Quando aplicado neste documento XML :
ou sobre isso:
ou sobre isso
o resultado correto é produzido :
Da mesma forma, use esta transformação XSLT 1.0 :
Observe : nenhum condicional é usado. Aprenda mais sobre a importância de evitar construções condicionais neste belo curso do Pluralsight:
" Padrões de design tático no .NET: fluxo de controle "
fonte
Se houver a possibilidade de o elemento não existir no XML, eu testaria se o elemento está presente e se o comprimento da string é maior que zero:
fonte
categoryName
fornece quando não hácategoryName
elementos filhos no contexto atual) é definido como a sequência vazia, portanto, isso é redundante -string-length(categoryName)
é zero se não houvercategoryName
elementos.Se um nó não tiver um valor disponível no xml de entrada, como abaixo do xpath,
A função string () converte em valor vazio. Então, isso funciona bem:
fonte
Algo assim funciona para mim:
Ou o contrário:
Nota: Se você não verificar valores nulos ou manipular valores nulos, o IE7 retornará -2147483648 em vez de NaN.
fonte
Na verdade, achei melhor apenas testar o comprimento da string, pois muitas vezes o campo não é nulo, apenas vazio
fonte
Pela minha experiência, a melhor maneira é:
fonte
Use categoryName simples / texto () Esse teste funciona bem
<categoryName/>
e também<categoryName></categoryName>
.fonte