xslt проблема

У меня есть (очень хорошая электронная таблица, например ...) XML-данные, из которых я должен создать дополнительные читаемый.
У меня есть заголовки в верхней части структуры, и я хотел бы создать элементы из ...

У меня есть (очень хорошая электронная таблица, например ...) XML-данные, из которых я должен создать дополнительные читаемый.
У меня есть заголовки в верхней части структуры, и я хотел бы создать элементы из ...

У меня есть (очень хорошая электронная таблица, например ...) XML-данные, из которых я должен создать дополнительные читаемый.
У меня есть заголовки в верхней части структуры, и я хотел бы создать элементов из их текстового значения и применить их к остальной части документа.

Вероятно, фактические данные говорят более четко, поэтому мой ввод документ выглядит как

<?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>

, и моя цель состоит в том, чтобы иметь XML-документ как:

<?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>

Я хотел бы сделать это "правильным" / "эффективным" способом, поэтому я обращаюсь к вам, ребята, к выручи меня.
I figured using a key to match data positions to header positions would be my solution, but for some reason it just doesn't work (I'am already ~X( ).

What I need is to point out what is wrong with my xsl, and/or if there's something wrong with the key concept, advise me better solution.

Here is my (debugging) 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>

where I verify that the position() is actually correct.

My output varies depending on which stylesheet version I use.

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>

As you can see, key('header',position()) gives me empty string in all the cases except the first (that's why i have it as value, not element name).

I would appreciate any help, thank you in advance!

Addition:
Основываясь на ответах @LarsH и @ Alejandro (все еще придерживающихся этого ключа ...), я придумал:

<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>

Я вижу, что здесь используется ключ со статическим 1 глупо, но меня пугает, почему два результирующих элемента оттуда не совпадают?
The first is correct, the second always gives me line, respectively lineproductorderqtydeadline back.

Could anyone point me to the right direction?

6
задан rekaszeru 4 May 2011 в 06:00
поделиться