Posso criar um valor para uma tag em falta no XPath?
Pergunta
Eu tenho uma aplicação que extrai dados de um arquivo XML usando XPath.Se um nó XML do arquivo de origem está faltando eu quero retornar o valor "N/d" (muito parecido com o Oracle NVL de função).O truque é que o aplicativo não oferece suporte a XSLT;Eu gostaria de fazer isso, usando XPath XPath e sozinho.
Isso é possível?
Solução
Isso pode ser feito, mas somente se o valor de retorno quando o nó existe é a cadeia de valor do nó, não o próprio nó.O XPath
substring(concat("N/A", /foo/baz), 4 * number(boolean(/foo/baz)))
retornará o valor de seqüência de caracteres de baz
elemento se houver, caso contrário, a seqüência de caracteres "N/A".
Para generalizar a abordagem:
substring(concat($null-value, $node),
(string-length($null-value) + 1) * number(boolean($node)))
onde $null-value
é nulo o valor de seqüência de caracteres e $node
a expressão para selecionar o nó.Observe que, se $node
avalia um conjunto de nós que contém mais de um nó, o valor de seqüência de caracteres de primeira nó é usado.
Outras dicas
Resposta curta:não.Tal função foi considerada e rejeitou explicitamente para a versão 2 do XPath spec (consulte a não-normativos Ilustrativo escrito pelo Usuário seção de Funções).
Para nós vazio, você precisa
boolean(string-length($node))
(Você pode omitir a chamada para number()
como o elenco de boolean para o número está implícito aqui.)
Isso pode ser feito com o XPath 1.0.Digamos que você tenha
<foo>
<bar/>
</foo>
Se você quiser testar se foo
tem um baz
filho,
substring("N/A", 4 * number(boolean(/foo/baz)))
vai voltar "N/A" se a expressão /foo/baz
retorna um nó vazio-definir, caso contrário, retorna uma seqüência de caracteres vazia.
@jelovirt
Então, se eu entender isso corretamente, é concatenar o padrão de resposta e o valor do nó e, em seguida, fazer o certo subconjunto de a cadeia resultante de testes para a existência de um nó para definir o deslocamento de zero ou a posição logo após o meu padrão de seqüência de caracteres.Que é o mais perverso de torção de uma língua que eu já vi.(Eu amo!)
Para esclarecer o que você disse, essa abordagem funciona quando o nó está em falta, e não quando o nó está vazio.Mas substituindo "(número booleano($node))" com "string-length($node)" ele vai trabalhar em nós vazio em vez disso.