Namespaces e XPath
Aula 3 de 5
Namespaces em XML
Namespaces evitam conflitos entre elementos de diferentes vocabulários XML.
Declaração de Namespaces
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:fo="http://www.w3.org/1999/XSL/Format"
xmlns="http://www.w3.org/1999/xhtml"
version="1.0">
<xsl:template match="/">
<html>
<body>
<fo:block font-weight="bold">
<xsl:value-of select="//titulo"/>
</fo:block>
</body>
</html>
</xsl:template>
</xsl:stylesheet>
Namespace Default e Prefixos
<!-- Namespace default (sem prefixo) -->
<html xmlns="http://www.w3.org/1999/xhtml">
<head><title>Página</title></head>
<body>
<!-- Com prefixo explícito -->
<svg:svg xmlns:svg="http://www.w3.org/2000/svg"
width="100" height="100">
<svg:circle cx="50" cy="50" r="40"/>
</svg:svg>
</body>
</html>
XPath — Navegação em Documentos XML
XPath é uma linguagem para navegar em elementos e atributos de documentos XML.
Eixos Principais
child::livro # filhos diretos
descendant::autor # todos os descendentes
parent::catalogo # elemento pai
attribute::id # atributo id
following::produto # elementos seguintes
preceding::produto # elementos anteriores
Predicados e Funções
//livro[ano > 2020] # condicional
//produto[@categoria = 'Eletrônicos'] # por atributo
//*[contains(nome, 'Pro')] # função string
//item[position() <= 3] # posição
//preco[number(text()) > 100] # função number
string-length(//titulo) # comprimento da string
concat(//nome, ' - ', //categoria) # concatenação
XPath na Prática
# Extrair valores com xmllint e XPath
xmllint --xpath "//produto[@id='101']/nome/text()" catalogo.xml
# Contar elementos
xmllint --xpath "count(//produto)" catalogo.xml
# Usar xpath em pipeline
curl -s http://api.exemplo.com/dados.xml | \
xmllint --xpath "//item[preco > 50]/nome/text()" -
Lab: Navegando com Namespaces e XPath
# 1. Criar documento com namespaces
cat << 'EOF' > ns-doc.xml
<?xml version="1.0"?>
<ns:loja xmlns:ns="http://exemplo.com/loja"
xmlns:cat="http://exemplo.com/catalogo">
<ns:cliente id="1">
<ns:nome>Ana Costa</ns:nome>
</ns:cliente>
<cat:produto id="P001">
<cat:nome>Notebook</cat:nome>
<cat:preco>4500.00</cat:preco>
</cat:produto>
</ns:loja>
EOF
# 2. XPath com namespace (xmllint precisa declarar namespace)
xmllint --shell ns-doc.xml << 'EOF'
setns ns=http://exemplo.com/loja
setns cat=http://exemplo.com/catalogo
xpath //ns:cliente/ns:nome/text()
xpath //cat:produto[cat:preco > 4000]/cat:nome/text()
xpath count(//cat:produto)
quit
EOF
# 3. Extrair todos os nomes com XPath
xmllint --xpath "//*[local-name()='nome']/text()" ns-doc.xml
Namespaces são essenciais para interoperabilidade; XPath é a lingua franca da navegação XML.