Preciso usar uma espécie de dicionário em XSLT para que, quando receber uma chave, eu possa recuperar um valor. Eu sei que existem maneiras mais formais de fazer isso, mas elas não têm relação com a minha pergunta.
Quando fornecido o seguinte XML:
<Root>
<Entry>
<Number>123456</Number>
<Key>1</Key>
</Entry>
</Root>
E aplicando a seguinte transformação:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text"
byte-order-mark="yes"
omit-xml-declaration="yes"/>
<xsl:variable name="myDictionary"
as="element()">
<dictionary>
<entry key="1">A</entry>
<entry key="2">B</entry>
<entry key="3">C</entry>
<entry key="4">D</entry>
<entry key="5">E</entry>
<entry key="6">F</entry>
<entry key="7">G</entry>
<entry key="8">H</entry>
<entry key="9">I</entry>
<entry key="10">J</entry>
<entry key="11">K</entry>
<entry key="12">L</entry>
<entry key="13">M</entry>
<entry key="14">N</entry>
<entry key="15">O</entry>
</dictionary>
</xsl:variable>
<xsl:template match="/">
<xsl:apply-templates select="Root/Entry"/>
</xsl:template>
<xsl:template match="Entry">
<!-- Employee Identifier -->
<xsl:value-of select="Number"/>
<xsl:text> : </xsl:text>
<xsl:value-of select="Key"/>
<xsl:text> : </xsl:text>
<xsl:value-of select="$myDictionary/entry[@key=Key]"/>
<xsl:text> : </xsl:text>
<xsl:value-of select="$myDictionary/entry[@key='1']"/>
</xsl:template>
</xsl:stylesheet>
Espero obter a seguinte saída:
123456 : 1 : A : A
O que realmente recebo é desconcertante:
123456 : 1 : : A
Na saída real, posso ver que <xsl:value-of select="Key"/>
mostra que contém o valor que espero:1
O último value-of
também se comporta como esperado: ao selecionar dentre os entry
elementos aquele que possui um atributo correspondente 1
, obtenho o valor que espero: A
.
Então, por que não recebo nenhum valor de volta na terceira value-of
instrução? Como Key
contém 1
e 1
corresponde a entry
contendo A
, devo obter A
... sim?
Alguma sugestão de por que isso não está funcionando da maneira que espero? Estou usando XSLT 2.0, aliás.
(aliás, também estou investigando como usar CORRETAMENTE a função key() no XSLT, o que pode resolver o problema, mas também quero saber a resposta para o quebra-cabeça acima).
esta afirmação:
irá comparar um elemento
Key
deentry
(xpath:entry/Key
) que não existe.Basta alterá-lo para:
Ele usará o contexto do modelo.
Ou outra opção seria primeiro armazenar essa chave em uma variável e usá-la assim:
Para completar, você poderia usar uma chave como esta: