xslt <uso da chave = "posição ()" ../> problema
Tenho uma (planilha do excel muito parecida com ..) dados xml, a partir dos quais devo criar um mais legíve
Tenho os cabeçalhos na parte superior da estrutura e gostaria de criarelements
pelo valor do texto e aplique-o no restante do document
Provavelmente os dados reais são mais claros, então meu documento de entrada se parece com
<?xml version="1.0"?>
<root>
<headers>
<header>line</header>
<header>product</header>
<header>order</header>
<header>qty</header>
<header>deadline</header>
</headers>
<row>
<data>2</data>
<data>HU12_SETUP</data>
<data>16069061</data>
<data>1</data>
<data>2011-04-13T09:22:59.980</data>
</row>
<row>
<data>1</data>
<data>40PFL7605H/12</data>
<data>16310360</data>
<data>200</data>
<data>2011-04-13T09:22:59.980</data>
</row>
</root>
e meu objetivo é ter um documento xml como:
<?xml version="1.0"?>
<morning>
<row>
<line>2</line>
<product>HU12_SETUP</product>
<order>16069061</order>
<qty>1</qty>
<deadline>0</deadline>
</row>
<row>
<line>1</line>
<product>40PFL7605H/12</product>
<order>16310360</order>
<qty>200</qty>
<deadline>77</deadline>
</row>
</morning>
Eu gostaria de fazer isso de uma maneira "adequada" / "eficiente", é por isso que estou me voltando para vocês, pessoal, para me ajuda
Eu imaginei usando umkey
para combinardata
posições paraheader
osições @ seria minha solução, mas por algum motivo isso simplesmente não funciona (eu já sou ~ X ().
O que eu preciso é apontar o que há de errado com o meu xsl e / ou se houver algo errado com okey
conceito, me aconselhe uma solução melhor.
Aqui está o meu (depuração) xsl:
<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" encoding="UTF-8" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:key name="header" match="header" use="position()" />
<xsl:template match="/">
<morning>
<xsl:apply-templates />
</morning>
</xsl:template>
<xsl:template match="headers" />
<xsl:template match="row">
<xsl:copy>
<xsl:apply-templates />
</xsl:copy>
</xsl:template>
<xsl:template match="data">
<xsl:element name="{concat('bla-',position())}">
<xsl:value-of select="key('header',position())" />
</xsl:element>
</xsl:template>
</xsl:stylesheet>
onde verifico se a posição () está realmente corret
Minha saída varia dependendo da versão da folha de estilo que eu us
output 1.0:
<?xml version='1.0' encoding='UTF-8' ?>
<morning>
<row>
<bla-1>line</bla-1>
<bla-2/>
<bla-3/>
<bla-4/>
<bla-5/>
</row>
<row>
<bla-1>line</bla-1>
<bla-2/>
<bla-3/>
<bla-4/>
<bla-5/>
</row>
</morning>
output 2.0:
<?xml version='1.0' encoding='UTF-8' ?>
<morning>
<row>
<bla-1>line product order qty deadline</bla-1>
<bla-2/>
<bla-3/>
<bla-4/>
<bla-5/>
</row>
<row>
<bla-1>line product order qty deadline</bla-1>
<bla-2/>
<bla-3/>
<bla-4/>
<bla-5/>
</row>
</morning>
Como você pode ver,key('header',position())
me fornece uma string vazia em todos os casos, exceto no primeiro (é por isso que eu tenho como valor, não o nome do elemento
Agradeço qualquer ajuda, agradeço antecipadamente!
Adiçã:
Com base nas respostas de LarsH e @ Alejandro (ainda presas a essakey
coisa ...) eu vim com:
<xsl:template match="data">
<xsl:variable name="posn" select="position()" />
<xsl:element name="{key('header',1)[$posn]}" />
<xsl:element name="{key('header',1)[position()]}" />
</xsl:template>
Consigo ver isso usando uma chave aqui com um @ estáti1
é idiota, mas estou ficando assustada porque os dois elementos resultantes lá de cima não combinam?
O primeiro está correto, o segundo sempre me dáline
, respectivamentelineproductorderqtydeadline
de volta
lguém poderia me indicar a direção cert