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?

Foi útil?

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.

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