У меня есть (очень хорошая электронная таблица, например ...) 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?